-
Notifications
You must be signed in to change notification settings - Fork 0
/
key.go
71 lines (60 loc) · 1.61 KB
/
key.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
/*
* go-leia
* Copyright (C) 2021 Nuts community
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package leia
import "bytes"
// Key is used as DB key type
type Key []byte
// KeyOf creates a key from an interface
func KeyOf(value interface{}) Key {
switch val := value.(type) {
case string:
return []byte(val)
case []byte:
return val
case Key:
return val
}
return nil
}
// String returns the string representation, only useful if a Key represents readable bytes
func (k Key) String() string {
return string(k)
}
// ComposeKey creates a new key from two keys
func ComposeKey(current Key, additional Key) Key {
if len(current) == 0 {
return additional
}
c := current.Split()
b := make([][]byte, len(c))
for i, k := range c {
b[i] = k
}
b = append(b, additional)
return bytes.Join(b, []byte{KeyDelimiter})
}
// Split splits a compound key into parts
func (k Key) Split() []Key {
s := bytes.Split(k, []byte{KeyDelimiter})
var nk = make([]Key, len(s))
for i, si := range s {
nk[i] = si
}
return nk
}