~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
48 lines · 1.0 KB Raw History
package b64

import (
	"encoding/base64"
	"encoding/json"
)

func Loose(s string) ([]byte, bool) {
	for _, enc := range []*base64.Encoding{base64.StdEncoding, base64.RawStdEncoding, base64.URLEncoding, base64.RawURLEncoding} {
		if b, err := enc.DecodeString(s); err == nil {
			return b, true
		}
	}
	return nil, false
}

func NormalizeJSON(value any) any {
	switch v := value.(type) {
	case map[string]any:
		if s, ok := v["$bytes"].(string); ok && len(v) == 1 {
			if b, ok := Loose(s); ok {
				return map[string]any{"$bytes": base64.RawStdEncoding.EncodeToString(b)}
			}
			return v
		}
		out := make(map[string]any, len(v))
		for k, item := range v {
			out[k] = NormalizeJSON(item)
		}
		return out
	case []any:
		out := make([]any, len(v))
		for i, item := range v {
			out[i] = NormalizeJSON(item)
		}
		return out
	default:
		return value
	}
}

func NormalizeJSONBytes(raw []byte) ([]byte, error) {
	var value any
	if err := json.Unmarshal(raw, &value); err != nil {
		return nil, err
	}
	return json.Marshal(NormalizeJSON(value))
}