package uuid import ( "crypto/sha1" "database/sql/driver" "encoding/hex" "fmt" "strings" ) type UUID [16]byte var UrlNS = UUID{0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1, 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8} func (u UUID) UUID5(value string) UUID { h := sha1.New() h.Write(u[:]) h.Write([]byte(value)) return UUID(h.Sum(nil)) } func (u *UUID) UnmarshalText(data string) error { data = strings.Trim(data, "{}") data = strings.ReplaceAll(data, "-", "") _, err := hex.Decode(u[:], []byte(data)) return err } func (u UUID) MarshalText() string { s := hex.EncodeToString(u[:]) return fmt.Sprintf("{%s-%s-%s-%s-%s}", s[:8], s[8:12], s[12:16], s[16:20], s[20:]) } func (u UUID) Value() (driver.Value, error) { return u[:], nil } func (u *UUID) Scan(value any) error { if value == nil { return nil } *u = UUID(value.([]byte)) return nil } type UUIDs []UUID func (lis UUIDs) ToStrList() List { arr := make(List, len(lis)) for i, v := range lis { arr[i] = v.MarshalText() } return arr } type List []string func (l *List) Scan(value any) error { s := value.(string) s = strings.Trim(s, "[]") for _, v := range strings.Split(s, ",") { v = strings.TrimSpace(v) v = strings.Trim(v, "\",") *l = append(*l, v) } return nil } func (l List) Value() (driver.Value, error) { arr := make([]string, len(l)) for i, v := range l { arr[i] = "\"" + v + "\"" } return "[" + strings.Join(arr, ",") + "]", nil }