-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
helpers.go
122 lines (103 loc) · 2.44 KB
/
helpers.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of K9s
package cmd
import (
"slices"
"strings"
"github.com/derailed/k9s/internal/client"
"github.com/rs/zerolog/log"
)
func ToLabels(s string) map[string]string {
ll := strings.Split(s, ",")
lbls := make(map[string]string, len(ll))
for _, l := range ll {
kv := strings.Split(l, "=")
if len(kv) < 2 || kv[0] == "" || kv[1] == "" {
continue
}
lbls[kv[0]] = kv[1]
}
if len(lbls) == 0 {
return nil
}
return lbls
}
// ShouldAddSuggest checks if a suggestion match the given command.
func ShouldAddSuggest(command, suggest string) (string, bool) {
if command != suggest && strings.HasPrefix(suggest, command) {
return strings.TrimPrefix(suggest, command), true
}
return "", false
}
// SuggestSubCommand suggests namespaces or contexts based on current command.
func SuggestSubCommand(command string, namespaces client.NamespaceNames, contexts []string) []string {
p := NewInterpreter(command)
var suggests []string
switch {
case p.IsCowCmd():
fallthrough
case p.IsHelpCmd():
fallthrough
case p.IsAliasCmd():
fallthrough
case p.IsBailCmd():
fallthrough
case p.IsDirCmd():
fallthrough
case p.IsAliasCmd():
return nil
case p.IsXrayCmd():
_, ns, ok := p.XrayArgs()
if !ok || ns == "" {
return nil
}
suggests = completeNS(ns, namespaces)
case p.IsContextCmd():
n, ok := p.ContextArg()
if !ok {
return nil
}
suggests = completeCtx(n, contexts)
case p.HasNS():
if n, ok := p.HasContext(); ok {
suggests = completeCtx(n, contexts)
}
log.Debug().Msgf("!!SUGG CTX!! %#v", suggests)
if len(suggests) > 0 {
break
}
ns, ok := p.NSArg()
if !ok {
return nil
}
suggests = completeNS(ns, namespaces)
log.Debug().Msgf("!!SUGG NS!! %#v", suggests)
default:
if n, ok := p.HasContext(); ok {
suggests = completeCtx(n, contexts)
}
}
slices.Sort(suggests)
return suggests
}
func completeNS(s string, nn client.NamespaceNames) []string {
var suggests []string
if suggest, ok := ShouldAddSuggest(s, client.NamespaceAll); ok {
suggests = append(suggests, suggest)
}
for ns := range nn {
if suggest, ok := ShouldAddSuggest(s, ns); ok {
suggests = append(suggests, suggest)
}
}
return suggests
}
func completeCtx(s string, cc []string) []string {
var suggests []string
for _, ctxName := range cc {
if suggest, ok := ShouldAddSuggest(s, ctxName); ok {
suggests = append(suggests, suggest)
}
}
return suggests
}