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-- file download

5f634e1 Jakob Wakeling 2024-05-31 15:15:34
0
package main
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
1
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
2
import (
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
3
	"encoding/json"
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
4
	"flag"
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
5
	"fmt"
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
6
	"io"
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
7
	"log"
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
8
	"os"
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
9
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
10
	"github.com/fxamacker/cbor/v2"
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
11
)
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
12
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
13
func main() {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
14
	flag.Parse()
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
15
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
16
	var buf []byte
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
17
	var err error
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
18
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
19
	if len(flag.Args()) == 0 {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
20
		buf, err = io.ReadAll(os.Stdin)
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
21
	} else {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
22
		buf, err = os.ReadFile(flag.Args()[0])
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
23
	}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
24
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
25
	if err != nil {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
26
		log.Fatalln(err.Error())
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
27
	}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
28
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
29
	var v any
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
30
	if err := cbor.Unmarshal(buf, &v); err == nil {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
31
		/* Decode CBOR to JSON */
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
32
		buf, err := json.MarshalIndent(fixKeys(v), "", "\t")
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
33
		if err != nil {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
34
			log.Fatalln(err.Error())
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
35
		}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
36
		os.Stdout.Write(buf)
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
37
	} else if err := json.Unmarshal(buf, &v); err == nil {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
38
		/* Encode JSON to CBOR */
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
39
		buf, err := cbor.Marshal(v)
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
40
		if err != nil {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
41
			log.Fatalln(err.Error())
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
42
		}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
43
		os.Stdout.Write(buf)
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
44
	} else {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
45
		log.Fatalln(err.Error())
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
46
	}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
47
}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
48
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
49
func fixKeys(v any) any {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
50
	switch v := v.(type) {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
51
	case map[any]any:
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
52
		o := make(map[string]any, len(v))
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
53
		for k, e := range v {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
54
			o[fmt.Sprintf("%v", k)] = fixKeys(e)
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
55
		}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
56
		return o
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
57
	case []any:
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
58
		o := make([]any, len(v))
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
59
		for i, e := range v {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
60
			o[i] = fixKeys(e)
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
61
		}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
62
		return o
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
63
	}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
64
	return v
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
65
}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
66
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
67
func If[T any](cond bool, a, b T) T {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
68
	if cond {
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
69
		return a
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
70
	}
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
71
	return b
5f634e1 Jakob Wakeling 2024-05-31 15:15:34
72
}
73