package main import ( "encoding/json" "flag" "fmt" "io" "log" "os" "github.com/fxamacker/cbor/v2" ) func main() { flag.Parse() var buf []byte var err error if len(flag.Args()) == 0 { buf, err = io.ReadAll(os.Stdin) } else { buf, err = os.ReadFile(flag.Args()[0]) } if err != nil { log.Fatalln(err.Error()) } var v any if err := cbor.Unmarshal(buf, &v); err == nil { /* Decode CBOR to JSON */ buf, err := json.MarshalIndent(fixKeys(v), "", "\t") if err != nil { log.Fatalln(err.Error()) } os.Stdout.Write(buf) } else if err := json.Unmarshal(buf, &v); err == nil { /* Encode JSON to CBOR */ buf, err := cbor.Marshal(v) if err != nil { log.Fatalln(err.Error()) } os.Stdout.Write(buf) } else { log.Fatalln(err.Error()) } } func fixKeys(v any) any { switch v := v.(type) { case map[any]any: o := make(map[string]any, len(v)) for k, e := range v { o[fmt.Sprintf("%v", k)] = fixKeys(e) } return o case []any: o := make([]any, len(v)) for i, e := range v { o[i] = fixKeys(e) } return o } return v } func If[T any](cond bool, a, b T) T { if cond { return a } return b }