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