diff --git a/model/id.go b/model/id.go deleted file mode 100644 index 96560bb5ef314abdb5e4bc8a54bdd126b68bd318..0000000000000000000000000000000000000000 --- a/model/id.go +++ /dev/null @@ -1,71 +0,0 @@ -package model - -import ( - "encoding/base32" - "fmt" - "io" - - "github.com/google/uuid" -) - -// Crockford's low-ambiguity base32 alphabet -var base32Encoding = base32. - NewEncoding("0123456789ABCDEFGHJKMNPQRSTVWXYZ"). - WithPadding(base32.NoPadding) - -type ID struct { - uuid uuid.UUID -} - -// Creates a new resource ID. -func NewID() ID { - uuid, err := uuid.NewV7() - if err != nil { - panic(err) - } - return ID{ - uuid: uuid, - } -} - -// Returns the UUID representation of this ID. -func (id *ID) UUID() uuid.UUID { - return id.uuid -} - -// Returns the string representation of this ID. -func (id *ID) String() string { - return base32Encoding.EncodeToString(id.uuid[:]) -} - -func (id ID) MarshalGQL(w io.Writer) { - w.Write(fmt.Appendf(nil, `"%s"`, id.String())) -} - -func (id *ID) UnmarshalGQL(v any) error { - switch v := v.(type) { - case string: - bytes, err := base32Encoding.DecodeString(v) - if err != nil { - return err - } - id.uuid, err = uuid.FromBytes(bytes) - if err != nil { - return err - } - return nil - default: - return fmt.Errorf("%T is not a valid ID", v) - } -} - -// database/sql.Scanner -func (id *ID) Scan(src any) error { - var uuid uuid.UUID - err := uuid.Scan(src) - if err != nil { - return err - } - id.uuid = uuid - return nil -} diff --git a/model/rid.go b/model/rid.go new file mode 100644 index 0000000000000000000000000000000000000000..15b12401c1b25318da82093d7b27033ff9665874 --- /dev/null +++ b/model/rid.go @@ -0,0 +1,78 @@ +package model + +import ( + "database/sql/driver" + "encoding/base32" + "fmt" + "io" + + "github.com/google/uuid" +) + +// Crockford's low-ambiguity base32 alphabet +var base32Encoding = base32. + NewEncoding("0123456789abcdefghjkmnpqrstvwxyz"). + WithPadding(base32.NoPadding) + +// An RID is a unique resource ID. +type RID struct { + uuid uuid.UUID +} + +// Creates a new resource ID. +func NewRID() RID { + uuid, err := uuid.NewV7() + if err != nil { + panic(err) + } + return RID{ + uuid: uuid, + } +} + +// Returns the UUID representation of this RID. +func (rid *RID) UUID() uuid.UUID { + return rid.uuid +} + +// Returns the string representation of this RID. +func (rid *RID) String() string { + return base32Encoding.EncodeToString(rid.uuid[:]) +} + +func (rid RID) MarshalGQL(w io.Writer) { + w.Write(fmt.Appendf(nil, `"%s"`, rid.String())) +} + +func (rid *RID) UnmarshalGQL(v any) error { + switch v := v.(type) { + case string: + bytes, err := base32Encoding.DecodeString(v) + if err != nil { + return err + } + rid.uuid, err = uuid.FromBytes(bytes) + if err != nil { + return err + } + return nil + default: + return fmt.Errorf("%T is not a valid RID", v) + } +} + +// database/sql.Scanner +func (rid *RID) Scan(src any) error { + var uuid uuid.UUID + err := uuid.Scan(src) + if err != nil { + return err + } + rid.uuid = uuid + return nil +} + +// database/sql/driver.Valuer +func (rid RID) Value() (driver.Value, error) { + return rid.UUID().Value() +}