package main 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() strList { arr := make(strList, len(lis)) for i, v := range lis { arr[i] = v.MarshalText() } return arr } type strList []string func (l *strList) 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 strList) Value() (driver.Value, error) { arr := make([]string, len(l)) for i, v := range l { arr[i] = "\""+v+"\"" } return "["+strings.Join(arr, ",") +"]", nil }