xt/internal/uuid/uuid.go
2025-03-31 17:39:24 -06:00

78 lines
1.4 KiB
Go

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
}