diff --git a/go.mod b/go.mod index dc12554..825ffd6 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/sanity-io/litter v1.5.5 github.com/spf13/cobra v1.8.0 golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc + gopkg.in/yaml.v3 v3.0.1 ) require ( diff --git a/go.sum b/go.sum index 40e003d..70bf89d 100644 --- a/go.sum +++ b/go.sum @@ -50,5 +50,7 @@ golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/types/date.go b/pkg/types/date.go index 5a51906..7a4ef0c 100644 --- a/pkg/types/date.go +++ b/pkg/types/date.go @@ -5,6 +5,8 @@ import ( "fmt" "strings" "time" + + "gopkg.in/yaml.v3" ) var ErrDateNotJSONString = errors.New("cannot parse non-string value as a date") @@ -13,12 +15,24 @@ type SerializableDate struct { time.Time } -func (date SerializableDate) MarshalJSON() ([]byte, error) { - return []byte("\"" + date.Format(time.DateOnly) + "\""), nil +func (d *SerializableDate) MarshalJSON() ([]byte, error) { + return []byte("\"" + d.Format(time.DateOnly) + "\""), nil +} + +func (d *SerializableDate) parse(date string) error { + parsedDate, err := time.Parse(time.DateOnly, date) + if err != nil { + return fmt.Errorf("unable to parse date from JSON: %w", err) + } + + d.Time = parsedDate + + return nil } -func (date *SerializableDate) UnmarshalJSON(data []byte) error { +func (d *SerializableDate) UnmarshalJSON(data []byte) error { stringifiedData := string(data) + if stringifiedData == "null" { return nil } @@ -29,12 +43,9 @@ func (date *SerializableDate) UnmarshalJSON(data []byte) error { dataWithoutQuotes := stringifiedData[1 : len(stringifiedData)-1] - parsedDate, err := time.Parse(time.DateOnly, dataWithoutQuotes) - if err != nil { - return fmt.Errorf("unable to parse date from JSON: %w", err) - } - - date.Time = parsedDate + return d.parse(dataWithoutQuotes) +} - return nil +func (d *SerializableDate) UnmarshalYAML(value *yaml.Node) error { + return d.parse(value.Value) }