-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlib.go
78 lines (61 loc) · 1.52 KB
/
lib.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package surrealhigh
import (
"errors"
"fmt"
"strings"
"github.com/google/uuid"
"github.com/rs/zerolog/log"
)
type Field string
func (f Field) String() string {
return string(f)
}
// Thing is a pointer to a Doc
type Thing string
type Id uuid.UUID
func (t Thing) String() string {
return string(t)
}
var (
ErrNotInThisTable = errors.New("thing not in this table")
ErrBadThing = errors.New("bad thing")
)
func NewIDFromThing(th Thing, tb Table) (_ Id, err error) {
rawId, found := strings.CutPrefix(string(th), tb.Prefix())
if !found {
fields := strings.FieldsFunc(th.String(), func(r rune) bool { return r == ':' })
if len(fields) != 2 {
err = fmt.Errorf("strings: len(colon fields)!=2: %w", ErrBadThing)
return
}
err = fmt.Errorf("strings: cut prefix: %w: %q not in %q; in %q", ErrNotInThisTable, string(th), string(tb), fields[0])
return
}
rawId = strings.ReplaceAll(rawId, "_", "-")
uid, err := uuid.Parse(rawId)
if err != nil {
log.Debug().Err(err).Msg("uuid: parse: " + rawId)
err = fmt.Errorf("uuid: parse: %w", err)
return
}
return Id(uid), nil
}
func (i Id) String() string {
canonic := strings.ReplaceAll(uuid.UUID(i).String(), "-", "_")
return canonic
}
type Table string
func (t Table) String() string {
return string(t)
}
func (t Table) Prefix() string {
return string(t) + ":"
}
func (i Id) Thing(t Table) Thing {
return Thing(t.Prefix() + i.String())
}
func NewID() Id {
return Id(uuid.New())
}
type Package string
func (pkg Package) String() string { return string(pkg) }