/
json.go
87 lines (75 loc) · 1.87 KB
/
json.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package transcribe
import (
"encoding/json"
"os"
"strings"
"github.com/fatih/color"
"github.com/hokaccha/go-prettyjson"
"github.com/tliron/go-ard"
"github.com/tliron/kutil/terminal"
"github.com/tliron/kutil/util"
)
func (self *Transcriber) WriteJSON(value any) error {
writer := self.Writer
if writer == nil {
writer = os.Stdout
}
// JSON encoders have problems with map[any]any
var err error
if value, err = ard.ValidCopyMapsToStringMaps(value, nil); err != nil {
return err
}
if self.ForTerminal {
var colorize bool
if self.Writer == os.Stderr {
colorize = terminal.ColorizeStderr
} else {
colorize = terminal.ColorizeStdout
}
if colorize {
formatter := NewJSONColorFormatter(terminal.IndentSpaces)
if bytes, err := formatter.Marshal(value); err == nil {
if _, err := writer.Write(bytes); err == nil {
return util.WriteNewline(writer)
} else {
return err
}
} else {
return err
}
}
}
self = self.fixIndentForTerminal()
encoder := json.NewEncoder(writer)
encoder.SetIndent("", self.Indent)
return encoder.Encode(value)
}
func (self *Transcriber) StringifyJSON(value any) (string, error) {
var writer strings.Builder
self = self.Clone()
self.Writer = &writer
if err := self.WriteJSON(value); err == nil {
s := writer.String()
if self.Indent == "" {
// json.Encoder adds a "\n", unlike json.Marshal
s = strings.TrimRight(s, "\n")
}
return s, nil
} else {
return "", err
}
}
// Utils
func NewJSONColorFormatter(indent int) *prettyjson.Formatter {
return &prettyjson.Formatter{
KeyColor: color.New(color.FgGreen),
StringColor: color.New(color.FgBlue),
BoolColor: color.New(color.FgCyan),
NumberColor: color.New(color.FgMagenta),
NullColor: color.New(color.FgCyan),
StringMaxLength: 0,
DisabledColor: false,
Indent: indent,
Newline: "\n",
}
}