Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
37e52595a2
|
|||
95d7c90492
|
|||
23a3235c7e
|
@@ -6,11 +6,11 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"go/format"
|
||||
"git.blackforestbytes.com/BlackForestBytes/goext"
|
||||
"git.blackforestbytes.com/BlackForestBytes/goext/cryptext"
|
||||
"git.blackforestbytes.com/BlackForestBytes/goext/langext"
|
||||
"git.blackforestbytes.com/BlackForestBytes/goext/rext"
|
||||
"go/format"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
@@ -46,7 +46,7 @@ var rexEnumPackage = rext.W(regexp.MustCompile(`^package\s+(?P<name>[A-Za-z0-9_]
|
||||
|
||||
var rexEnumDef = rext.W(regexp.MustCompile(`^\s*type\s+(?P<name>[A-Za-z0-9_]+)\s+(?P<type>[A-Za-z0-9_]+)\s*//\s*(@enum:type).*$`))
|
||||
|
||||
var rexEnumValueDef = rext.W(regexp.MustCompile(`^\s*(?P<name>[A-Za-z0-9_]+)\s+(?P<type>[A-Za-z0-9_]+)\s*=\s*(?P<value>("[A-Za-z0-9_:\s\-.]*"|[0-9]+))\s*(//(?P<comm>.*))?.*$`))
|
||||
var rexEnumValueDef = rext.W(regexp.MustCompile(`^\s*(?P<name>[A-Za-z0-9_]+)\s+(?P<type>[A-Za-z0-9_]+)\s*=\s*(?P<value>("[@A-Za-z0-9_:\s\-.]*"|[0-9]+))\s*(//(?P<comm>.*))?.*$`))
|
||||
|
||||
var rexEnumChecksumConst = rext.W(regexp.MustCompile(`const ChecksumEnumGenerator = "(?P<cs>[A-Za-z0-9_]*)"`))
|
||||
|
||||
|
2
go.mod
2
go.mod
@@ -38,7 +38,7 @@ require (
|
||||
github.com/google/uuid v1.5.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/compress v1.18.0 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.11 // indirect
|
||||
github.com/leodido/go-urn v1.4.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
|
2
go.sum
2
go.sum
@@ -126,6 +126,8 @@ github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kK
|
||||
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
|
||||
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
|
||||
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU=
|
||||
github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
||||
|
@@ -1,5 +1,5 @@
|
||||
package goext
|
||||
|
||||
const GoextVersion = "0.0.581"
|
||||
const GoextVersion = "0.0.584"
|
||||
|
||||
const GoextVersionTimestamp = "2025-06-25T10:28:54+0200"
|
||||
const GoextVersionTimestamp = "2025-06-26T16:48:07+0200"
|
||||
|
@@ -8,7 +8,6 @@ import (
|
||||
// DecodeBase64Any decodes a base64 encoded string
|
||||
// Works with all variants (std, url, imap), padded and unpadded and even ignores linrebreaks and indents
|
||||
func DecodeBase64Any(data string) ([]byte, error) {
|
||||
|
||||
data = strings.ReplaceAll(data, "\n", "") // remove linebreaks and indents
|
||||
data = strings.ReplaceAll(data, "\t", "") // remove linebreaks and indents
|
||||
data = strings.ReplaceAll(data, " ", "") // remove linebreaks and indents
|
||||
@@ -18,7 +17,7 @@ func DecodeBase64Any(data string) ([]byte, error) {
|
||||
data = strings.ReplaceAll(data, "_", "/") // base64_url --> base64_std
|
||||
data = strings.ReplaceAll(data, "-", "+") // base64_url --> base64_std
|
||||
|
||||
data = strings.ReplaceAll(data, "=", " ") // no padding
|
||||
data = strings.ReplaceAll(data, "=", "") // no padding
|
||||
|
||||
return base64.RawStdEncoding.DecodeString(data)
|
||||
}
|
||||
|
246
langext/base64_test.go
Normal file
246
langext/base64_test.go
Normal file
@@ -0,0 +1,246 @@
|
||||
package langext
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestDecodeBase64Any_StandardPadded(t *testing.T) {
|
||||
input := "SGVsbG8gV29ybGQ=" // "Hello World" in standard Base64 (padded)
|
||||
expected := "Hello World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_StandardUnpadded(t *testing.T) {
|
||||
input := "SGVsbG8gV29ybGQ" // "Hello World" in standard Base64 (unpadded)
|
||||
expected := "Hello World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_URLPadded(t *testing.T) {
|
||||
input := "SGVsbG8tV29ybGQ=" // "Hello-World" in Base64 URL (padded)
|
||||
expected := "Hello-World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_URLUnpadded(t *testing.T) {
|
||||
input := "SGVsbG8tV29ybGQ" // "Hello-World" in Base64 URL (unpadded)
|
||||
expected := "Hello-World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_IMAPPadded(t *testing.T) {
|
||||
input := "SGVsbG8,V29ybGQ=" // "Hello/World" in Base64 IMAP (padded)
|
||||
expected := "Hello?World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_IMAPUnpadded(t *testing.T) {
|
||||
input := "SGVsbG8,V29ybGQ" // "Hello/World" in Base64 IMAP (unpadded)
|
||||
expected := "Hello?World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_InvalidInput(t *testing.T) {
|
||||
input := "Invalid@@Base64" // Invalid Base64 input
|
||||
|
||||
_, err := DecodeBase64Any(input)
|
||||
if err == nil {
|
||||
t.Fatal("expected an error, but got none")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_EmptyInput(t *testing.T) {
|
||||
input := "" // Empty input
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if len(result) != 0 {
|
||||
t.Errorf("expected empty result, got %q", string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_WhitespaceInput(t *testing.T) {
|
||||
input := " SGVsbG8gV29ybGQ= " // Input with leading and trailing spaces
|
||||
expected := "Hello World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_LineBreaksInput(t *testing.T) {
|
||||
input := "SGVs\nbG8g\nV29y\nbGQ=" // Input with line breaks
|
||||
expected := "Hello World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_TabCharactersInput(t *testing.T) {
|
||||
input := "SGVsbG8g\tV29ybGQ=" // Input with tab characters
|
||||
expected := "Hello World"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_SpecialCharactersIgnored(t *testing.T) {
|
||||
input := "SGVsbG8gV29ybGQ=!!" // Input with ignored special characters
|
||||
|
||||
_, err := DecodeBase64Any(input)
|
||||
if err == nil {
|
||||
t.Fatal("expected an error, but got none")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_SingleCharacterInput(t *testing.T) {
|
||||
input := "QQ==" // "A" in Base64
|
||||
expected := "A"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_LongInput(t *testing.T) {
|
||||
input := "U29tZSB2ZXJ5IGxvbmcgc3RyaW5nIHdpdGggbXVsdGlwbGUgbGluZXMgYW5kIHNwYWNlcy4=" // Long Base64 string
|
||||
expected := "Some very long string with multiple lines and spaces."
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_Standard63And64(t *testing.T) {
|
||||
input := "Pz8/Pw==" // "???" in standard Base64 (63 = '+', 64 = '/')
|
||||
expected := "????"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_Standard63And64_NoPad(t *testing.T) {
|
||||
input := "Pz8/Pw" // "???" in standard Base64 (63 = '+', 64 = '/')
|
||||
expected := "????"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_URL63And64(t *testing.T) {
|
||||
input := "Pz8_Pw==" // "???" in Base64 URL-safe (63 = '_', 64 = '-')
|
||||
expected := "????"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeBase64Any_URL63And64_NoPad(t *testing.T) {
|
||||
input := "Pz8_Pw==" // "???" in Base64 URL-safe (63 = '_', 64 = '-')
|
||||
expected := "????"
|
||||
|
||||
result, err := DecodeBase64Any(input)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if string(result) != expected {
|
||||
t.Errorf("expected %q, got %q", expected, string(result))
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user