tools

Miscellaneous software tools
git clone http://git.omkov.net/tools
Log | Tree | Refs | Download

tools/src/cbor/main.go (74 lines, 1.1 KiB) -rw-r--r-- blame download

012345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
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
}