From f3bf89b09e6cff7eae1b5277c1d8a08c5ec08c1f Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Sun, 28 Jan 2024 19:41:30 -0600 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Entry=20implements=20json.Marshaler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/entry.go | 21 ++++++++++++++++++++- models/entry_test.go | 3 ++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/models/entry.go b/models/entry.go index 90b682d..e14ae06 100644 --- a/models/entry.go +++ b/models/entry.go @@ -3,6 +3,7 @@ package models import ( "bufio" "bytes" + "encoding/json" "errors" "regexp" "strings" @@ -157,5 +158,23 @@ func (e *Entry) getFieldUnarshalChan(in []byte) chan Meta { } func (e Entry) MarshalJSON() ([]byte, error) { - return []byte(`{}`), nil + if e.Title == "" { + return []byte{}, ErrorMissingTitle + } + if e.Date == (time.Time{}) { + return []byte{}, ErrorMissingDate + } + + out := map[string]any{} + out["title"] = e.Title + out["date"] = e.Date.Format(time.RFC3339) + for _, f := range e.Fields { + if _, ok := out[f.Key]; !ok { + out[f.Key] = f.Value + if vt, ok := f.Value.(time.Time); ok { + out[f.Key] = vt.Format(time.RFC3339) + } + } + } + return json.Marshal(out) } diff --git a/models/entry_test.go b/models/entry_test.go index dc4d152..38d9e5d 100644 --- a/models/entry_test.go +++ b/models/entry_test.go @@ -191,7 +191,7 @@ func TestScan(t *testing.T) { func TestEntryJsonMarshal(t *testing.T) { when := time.Now() - whens := when.Format(DateFormat) + whens := when.Format(time.RFC3339) simple := []Meta{} tests := []struct { name string @@ -210,6 +210,7 @@ func TestEntryJsonMarshal(t *testing.T) { {"empty-title", "", when, simple, "", ErrorMissingTitle}, {"empty-date", "A Title", time.Time{}, simple, "", ErrorMissingDate}, {"obj-field", "A Title", when, []Meta{{"obj", json.RawMessage(`{"foo":"bar","title":"Sub-title"}`)}}, `{"title":"A Title","date":"` + whens + `","obj":{"foo":"bar","title":"Sub-title"}}`, nil}, + {"date-field", "A Title", when, []Meta{{"when", when.Add(time.Hour)}}, `{"title":"A Title","date":"` + whens + `","when":"` + when.Add(time.Hour).Format(time.RFC3339) + `"}`, nil}, } for _, tt := range tests {