Skip to content

Commit 897ee18

Browse files
authored
Prefix helper (#1779)
1 parent ee57ba2 commit 897ee18

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

keystore/keystore.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,20 @@ func (k KeyPath) Base() string {
3535
return k[len(k)-1]
3636
}
3737

38+
// HasPrefix returns true if k starts with the given prefix path.
39+
// For example, KeyPath{"solana", "tx", "my-key"}.HasPrefix(KeyPath{"solana", "tx"}) returns true.
40+
func (k KeyPath) HasPrefix(prefix KeyPath) bool {
41+
if len(prefix) > len(k) {
42+
return false
43+
}
44+
for i := range prefix {
45+
if k[i] != prefix[i] {
46+
return false
47+
}
48+
}
49+
return true
50+
}
51+
3852
func NewKeyPath(segments ...string) KeyPath {
3953
return segments
4054
}
@@ -44,7 +58,7 @@ func NewKeyPathFromString(fullName string) KeyPath {
4458
}
4559

4660
// joinKeySegments joins path-like key name segments using "/" and avoids double slashes.
47-
// Empty segments are skipped so joinKeySegments("EVM", "TX", "my-key") => "EVM/TX/my-key".
61+
// Empty segments are skipped so joinKeySegments("evm", "tx", "my-key") => "evm/tx/my-key".
4862
func joinKeySegments(segments ...string) string {
4963
cleaned := make([]string, 0, len(segments))
5064
for _, s := range segments {

keystore/keystore_internal_test.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,33 @@ func TestJoinKeySegments(t *testing.T) {
3636
segments []string
3737
expected string
3838
}{
39-
{segments: []string{"EVM", "TX", "my-key"}, expected: "EVM/TX/my-key"},
40-
{segments: []string{"EVM", "/TX", "my-key"}, expected: "EVM/TX/my-key"},
41-
{segments: []string{"EVM", "TX/", "my-key"}, expected: "EVM/TX/my-key"},
42-
{segments: []string{"EVM", "TX", "/my-key"}, expected: "EVM/TX/my-key"},
43-
{segments: []string{"EVM", "TX", "my-key", ""}, expected: "EVM/TX/my-key"},
44-
{segments: []string{"EVM", "TX", "my-key", "/"}, expected: "EVM/TX/my-key"},
45-
{segments: []string{"EVM", "TX", "my-key", "//"}, expected: "EVM/TX/my-key"},
46-
{segments: []string{"EVM", "TX", "my-key", "///"}, expected: "EVM/TX/my-key"},
47-
{segments: []string{"EVM", "TX", "my-key", "////"}, expected: "EVM/TX/my-key"},
39+
{segments: []string{"evm", "tx", "my-key"}, expected: "evm/tx/my-key"},
40+
{segments: []string{"evm", "/tx", "my-key"}, expected: "evm/tx/my-key"},
41+
{segments: []string{"evm", "tx/", "my-key"}, expected: "evm/tx/my-key"},
42+
{segments: []string{"evm", "tx", "/my-key"}, expected: "evm/tx/my-key"},
43+
{segments: []string{"evm", "tx", "my-key", ""}, expected: "evm/tx/my-key"},
44+
{segments: []string{"evm", "tx", "my-key", "/"}, expected: "evm/tx/my-key"},
45+
{segments: []string{"evm", "tx", "my-key", "//"}, expected: "evm/tx/my-key"},
46+
{segments: []string{"evm", "tx", "my-key", "///"}, expected: "evm/tx/my-key"},
47+
{segments: []string{"evm", "tx", "my-key", "////"}, expected: "evm/tx/my-key"},
4848
}
4949
for _, tt := range tests {
5050
require.Equal(t, tt.expected, joinKeySegments(tt.segments...))
5151
}
5252
}
53+
54+
func TestKeyPathHasPrefix(t *testing.T) {
55+
tests := []struct {
56+
path KeyPath
57+
prefix KeyPath
58+
expected bool
59+
}{
60+
{path: KeyPath{"evm", "tx", "my-key"}, prefix: KeyPath{"evm", "tx"}, expected: true},
61+
{path: KeyPath{"evm", "tx", "my-key"}, prefix: KeyPath{"evm"}, expected: true},
62+
{path: KeyPath{"evm", "tx", "my-key"}, prefix: KeyPath{"evm", "tx", "my-key"}, expected: true},
63+
{path: KeyPath{"evm", "tx", "my-key"}, prefix: KeyPath{"evm", "tx", "my-key", "extra"}, expected: false},
64+
}
65+
for _, tt := range tests {
66+
require.Equal(t, tt.expected, tt.path.HasPrefix(tt.prefix))
67+
}
68+
}

0 commit comments

Comments
 (0)