From 9016875caee4d838233b5af0ca2c34a2732faa16 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Thu, 2 Apr 2020 14:01:16 -0500 Subject: [PATCH] Add JSON support to ext/gofrs-uuid --- ext/gofrs-uuid/uuid.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/ext/gofrs-uuid/uuid.go b/ext/gofrs-uuid/uuid.go index b0413cae..fec912bc 100644 --- a/ext/gofrs-uuid/uuid.go +++ b/ext/gofrs-uuid/uuid.go @@ -10,6 +10,7 @@ import ( ) var errUndefined = errors.New("cannot encode status undefined") +var errBadStatus = errors.New("invalid status") type UUID struct { UUID uuid.UUID @@ -172,3 +173,32 @@ func (dst *UUID) Scan(src interface{}) error { func (src UUID) Value() (driver.Value, error) { return pgtype.EncodeValueText(src) } + +func (src UUID) MarshalJSON() ([]byte, error) { + switch src.Status { + case pgtype.Present: + return []byte(`"` + src.UUID.String() + `"`), nil + case pgtype.Null: + return []byte("null"), nil + case pgtype.Undefined: + return nil, errUndefined + } + + return nil, errBadStatus +} + +func (dst *UUID) UnmarshalJSON(b []byte) error { + u := uuid.NullUUID{} + err := u.UnmarshalJSON(b) + if err != nil { + return err + } + + status := pgtype.Null + if u.Valid { + status = pgtype.Present + } + *dst = UUID{UUID: u.UUID, Status: status} + + return nil +}