An experimental IndieWeb site built in Go.
1package models
2
3import (
4 "database/sql/driver"
5
6 "codeberg.org/gruf/go-ulid"
7 "gorm.io/gorm"
8 "gorm.io/gorm/schema"
9)
10
11type ULID ulid.ULID
12
13func NewULID() ULID {
14 return ULID(ulid.MustNew())
15}
16
17func (ULID) GormDataType() string {
18 return "string"
19}
20
21func (ULID) GormDBDataType(db *gorm.DB, field *schema.Field) string {
22 switch db.Dialector.Name() {
23 case "mysql":
24 return "LONGTEXT"
25 case "postgres":
26 return "UUID"
27 case "sqlserver":
28 return "NVARCHAR"
29 case "sqlite":
30 return "TEXT"
31 default:
32 return ""
33 }
34}
35
36func (u *ULID) Scan(value interface{}) error {
37 var result ulid.ULID
38 if err := result.Scan(value); err != nil {
39 return err
40 }
41 *u = ULID(result)
42 return nil
43}
44
45func (u ULID) Value() (driver.Value, error) {
46 return ulid.ULID(u).String(), nil
47}
48
49func (u ULID) String() string {
50 return ulid.ULID(u).String()
51}
52
53func (u ULID) Equals(other ULID) bool {
54 return u.String() == other.String()
55}
56
57func (u ULID) Length() int {
58 return len(u.String())
59}
60
61func (u ULID) IsNil() bool {
62 zero, err := ulid.ParseString("0000000000000000")
63 if err != nil {
64 panic(err)
65 }
66
67 return ulid.ULID(u) == zero
68}
69
70func (u ULID) IsEmpty() bool {
71 return u.IsNil() || u.Length() == 0
72}
73
74func (u *ULID) IsNilPtr() bool {
75 return u == nil
76}
77
78func (u *ULID) IsEmptyPtr() bool {
79 return u.IsNilPtr() || u.IsEmpty()
80}