From 1962e1db502211815f0ae8f49c3c84de718e2004 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Sun, 10 Mar 2024 12:14:21 -0500 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Pretty=20print=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- formatters/json.go | 28 +++++++++++++++++++++------- formatters/json_test.go | 22 ++++++++++++++++++---- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/formatters/json.go b/formatters/json.go index b3b2d97..d56854d 100644 --- a/formatters/json.go +++ b/formatters/json.go @@ -1,30 +1,44 @@ package formatters import ( + "bytes" "encoding/json" "time" "codeberg.org/danjones000/my-log/config" "codeberg.org/danjones000/my-log/models" - //"codeberg.org/danjones000/my-log/tools" ) func newJson(ff config.Formatters) (Formatter, error) { - // @todo pretty print - return &Json{ff.Json()}, nil + return &Json{ff.Json().PrettyPrint}, nil } type Json struct { - jf config.JsonFormat + prettPrint bool } func (js *Json) Name() string { return "json" } +func (js *Json) marshal(v any) (o []byte, err error) { + o, err = json.Marshal(v) + if err != nil { + return + } + if js.prettPrint { + buff := &bytes.Buffer{} + err = json.Indent(buff, o, "", "\t") + if err == nil { + o = buff.Bytes() + } + } + return +} + func (js *Json) Meta(m models.Meta) ([]byte, error) { o := map[string]any{m.Key: m.Value} - return json.Marshal(o) + return js.marshal(o) } func (js *Json) entryMap(e models.Entry) map[string]any { @@ -39,7 +53,7 @@ func (js *Json) entryMap(e models.Entry) map[string]any { } func (js *Json) Entry(e models.Entry) ([]byte, error) { - return json.Marshal(js.entryMap(e)) + return js.marshal(js.entryMap(e)) } func (js *Json) Log(l models.Log) ([]byte, error) { @@ -59,5 +73,5 @@ func (js *Json) Logs(logs []models.Log) (out []byte, err error) { } o[l.Name] = es } - return json.Marshal(o) + return js.marshal(o) } diff --git a/formatters/json_test.go b/formatters/json_test.go index a81d4ed..da6f111 100644 --- a/formatters/json_test.go +++ b/formatters/json_test.go @@ -1,16 +1,12 @@ package formatters import ( - //"bufio" - //"bytes" "fmt" "testing" "time" "codeberg.org/danjones000/my-log/models" - //"codeberg.org/danjones000/my-log/tools" "github.com/stretchr/testify/assert" - //"github.com/stretchr/testify/require" ) func TestJsonName(t *testing.T) { @@ -65,3 +61,21 @@ func TestJsonNoLogs(t *testing.T) { assert.NoError(t, err) assert.Equal(t, exp, o) } + +func TestJsonErr(t *testing.T) { + f, _ := New("json") + o, err := f.Meta(models.Meta{"foo", make(chan bool)}) + var exp []byte + assert.Error(t, err) + assert.Equal(t, exp, o) +} + +func TestJsonPretty(t *testing.T) { + f := Json{true} + o, err := f.Meta(models.Meta{"foo", 42}) + exp := `{ + "foo": 42 +}` + assert.NoError(t, err) + assert.Equal(t, exp, string(o)) +}