Entry implements json.Unmarshaler

This commit is contained in:
Dan Jones 2024-01-29 22:07:18 -06:00
commit 0da5efcafe
2 changed files with 53 additions and 6 deletions

View file

@ -179,6 +179,50 @@ func (e Entry) MarshalJSON() ([]byte, error) {
return json.Marshal(out)
}
func (e *Entry) UnmarshalJSON([]byte) error {
func (e *Entry) UnmarshalJSON(in []byte) error {
out := map[string]any{}
dec := json.NewDecoder(bytes.NewReader(in))
dec.UseNumber()
err := dec.Decode(&out)
if err != nil {
return newParsingError(err)
}
title, ok := out["title"].(string)
if !ok || title == "" {
return ErrorMissingTitle
}
e.Title = title
delete(out, "title")
dates, ok := out["date"].(string)
if !ok || dates == "" {
return ErrorMissingDate
}
date, err := time.Parse(time.RFC3339, dates)
if err != nil {
return newParsingError(err)
}
e.Date = date
delete(out, "date")
for k, v := range out {
m := Meta{Key: k}
if vs, ok := v.(string); ok {
if vd, err := time.Parse(time.RFC3339, vs); err == nil {
m.Value = vd
} else {
m.Value = vs
}
} else if n, ok := v.(json.Number); ok {
it, _ := n.Int64()
fl, _ := n.Float64()
if float64(it) == fl {
m.Value = it
} else {
m.Value = fl
}
} else {
m.Value = v
}
e.Fields = append(e.Fields, m)
}
return nil
}