diff --git a/generics/data.go b/generics/data.go new file mode 100644 index 0000000..1c28f6a --- /dev/null +++ b/generics/data.go @@ -0,0 +1,13 @@ +package generics + +import "encoding/json" + +func UnmarshalTo[T any](raw []byte) (*T, error) { + var resp T + err := json.Unmarshal(raw, &resp) + if err != nil { + return nil, err + } + + return &resp, nil +} diff --git a/generics/go.mod b/generics/go.mod new file mode 100644 index 0000000..2838567 --- /dev/null +++ b/generics/go.mod @@ -0,0 +1,3 @@ +module gitea.codeblob.work/pk/gut/generics + +go 1.21.6 diff --git a/generics/misc.go b/generics/misc.go new file mode 100644 index 0000000..82dc8b6 --- /dev/null +++ b/generics/misc.go @@ -0,0 +1,23 @@ +package generics + +// Search for one or more needles in the haystack. +// Returns true if any of the needles was found. +func ContainsAny[T comparable](haystack []T, needle ...T) bool { + for _, n := range needle { + for _, h := range haystack { + if h == n { + return true + } + } + } + + return false +} + +func IfThen[T any](cond bool, then T, otherwise T) T { + if cond { + return then + } else { + return otherwise + } +} diff --git a/generics/set.go b/generics/set.go new file mode 100644 index 0000000..4641978 --- /dev/null +++ b/generics/set.go @@ -0,0 +1,46 @@ +package generics + +type Set[T comparable] map[T]struct{} + +// New produces a new set containing the given values. +func NewSet[T comparable](vals ...T) Set[T] { + s := Set[T](make(map[T]struct{})) + for _, val := range vals { + s.Add(val) + } + return Set[T](s) +} + +// Add adds values to the set. +func (s Set[T]) Add(vals ...T) { + for _, val := range vals { + s[val] = struct{}{} + } +} + +// Check if a value is already present in the set. +func (s Set[T]) Has(val T) bool { + _, ok := s[val] + return ok +} + +// Removes a value from the set. +func (s Set[T]) Remove(vals ...T) { + for _, val := range vals { + delete(s, val) + } +} + +// Number of values in the set. +func (s Set[T]) Length() int { + return len(s) +} + +// Get a slice of values in the set. +func (s Set[T]) Values() []T { + values := make([]T, 0, len(s)) + for k := range s { + values = append(values, k) + } + return values +} diff --git a/go.work b/go.work new file mode 100644 index 0000000..030b41a --- /dev/null +++ b/go.work @@ -0,0 +1,5 @@ +go 1.21.6 + +use ./generics + +use ./settingsdb diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 0000000..578cd42 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,10 @@ +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/settingsdb/go.mod b/settingsdb/go.mod index e382ecd..12fe9b9 100644 --- a/settingsdb/go.mod +++ b/settingsdb/go.mod @@ -4,4 +4,10 @@ go 1.21.6 require github.com/syndtr/goleveldb v1.0.0 -require github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect +require ( + github.com/golang/snappy v0.0.1 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + gopkg.in/yaml.v2 v2.2.2 // indirect +) diff --git a/settingsdb/go.sum b/settingsdb/go.sum index 52ee205..ce60e4a 100644 --- a/settingsdb/go.sum +++ b/settingsdb/go.sum @@ -1,7 +1,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -11,17 +11,17 @@ github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= diff --git a/settingsdb/settingsdb.go b/settingsdb/settingsdb.go index 7139e77..4dbad8c 100644 --- a/settingsdb/settingsdb.go +++ b/settingsdb/settingsdb.go @@ -3,6 +3,8 @@ package settingsdb import ( "encoding/json" + "gitea.codeblob.work/pk/gut/generics" + "github.com/syndtr/goleveldb/leveldb" ) @@ -47,6 +49,20 @@ func (s *SettingsDB) GetString(key string) string { return string(data) } +func (s *SettingsDB) GetStrings(key string) []string { + data, err := s.db.Get([]byte(key), nil) + if err != nil { + return nil + } + + value, err := generics.UnmarshalTo[[]string](data) + if err != nil { + return nil + } + + return *value +} + func (s *SettingsDB) Close() { s.db.Close() }