64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package view
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/derailed/k9s/internal/client"
|
|
)
|
|
|
|
// K9sEnv represent K9s available env variables.
|
|
type K9sEnv map[string]string
|
|
|
|
// EnvRX match $XXX custom arg.
|
|
var envRX = regexp.MustCompile(`\$(\!?[\w]+)(\d*)`)
|
|
|
|
func (e K9sEnv) envFor(ns, args string) (string, error) {
|
|
envs := envRX.FindStringSubmatch(args)
|
|
if len(envs) == 0 {
|
|
return args, nil
|
|
}
|
|
|
|
q := envs[1]
|
|
if envs[2] == "" {
|
|
return e.subOut(args, q)
|
|
}
|
|
|
|
var index, err = strconv.Atoi(envs[2])
|
|
if err != nil {
|
|
return args, err
|
|
}
|
|
if client.IsNamespaced(ns) {
|
|
index -= 1
|
|
}
|
|
if index >= 0 {
|
|
q += strconv.Itoa(index)
|
|
}
|
|
|
|
return e.subOut(args, q)
|
|
}
|
|
|
|
func (e K9sEnv) subOut(args, q string) (string, error) {
|
|
var reverse bool
|
|
if q[0] == '!' {
|
|
reverse = true
|
|
q = q[1:]
|
|
}
|
|
env, ok := e[strings.ToUpper(q)]
|
|
if !ok {
|
|
return "", fmt.Errorf("no env vars exists for argument %q using key %q", args, q)
|
|
}
|
|
|
|
if b, err := strconv.ParseBool(env); err == nil {
|
|
if reverse {
|
|
env = fmt.Sprintf("%t", !b)
|
|
} else {
|
|
env = fmt.Sprintf("%t", b)
|
|
}
|
|
}
|
|
|
|
return envRX.ReplaceAllString(args, env), nil
|
|
}
|