Pretty print JSON

This commit is contained in:
Dan Jones 2024-03-10 12:14:21 -05:00
commit 1962e1db50
2 changed files with 39 additions and 11 deletions

View file

@ -1,30 +1,44 @@
package formatters package formatters
import ( import (
"bytes"
"encoding/json" "encoding/json"
"time" "time"
"codeberg.org/danjones000/my-log/config" "codeberg.org/danjones000/my-log/config"
"codeberg.org/danjones000/my-log/models" "codeberg.org/danjones000/my-log/models"
//"codeberg.org/danjones000/my-log/tools"
) )
func newJson(ff config.Formatters) (Formatter, error) { func newJson(ff config.Formatters) (Formatter, error) {
// @todo pretty print return &Json{ff.Json().PrettyPrint}, nil
return &Json{ff.Json()}, nil
} }
type Json struct { type Json struct {
jf config.JsonFormat prettPrint bool
} }
func (js *Json) Name() string { func (js *Json) Name() string {
return "json" 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) { func (js *Json) Meta(m models.Meta) ([]byte, error) {
o := map[string]any{m.Key: m.Value} 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 { 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) { 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) { 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 o[l.Name] = es
} }
return json.Marshal(o) return js.marshal(o)
} }

View file

@ -1,16 +1,12 @@
package formatters package formatters
import ( import (
//"bufio"
//"bytes"
"fmt" "fmt"
"testing" "testing"
"time" "time"
"codeberg.org/danjones000/my-log/models" "codeberg.org/danjones000/my-log/models"
//"codeberg.org/danjones000/my-log/tools"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
//"github.com/stretchr/testify/require"
) )
func TestJsonName(t *testing.T) { func TestJsonName(t *testing.T) {
@ -65,3 +61,21 @@ func TestJsonNoLogs(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, exp, o) 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))
}