aboutsummaryrefslogtreecommitdiff
path: root/model/lookup.go
diff options
context:
space:
mode:
Diffstat (limited to 'model/lookup.go')
-rw-r--r--model/lookup.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/model/lookup.go b/model/lookup.go
new file mode 100644
index 0000000..e8cc8bf
--- /dev/null
+++ b/model/lookup.go
@@ -0,0 +1,49 @@
+package model
+
+import (
+ "os"
+ "strings"
+)
+
+// WordLookup тип определяющий функцию поиска замены слов при
+// стрингификации Values.
+type WordLookup func(word Word) string
+
+// chainLookup утилитарная функция для последовательных применений функций
+// поиска до первого нахождения подстановки. Если returnOrigin == true,
+// то в случае неудачи вернёт имя слова.
+func chainLookup(lookups ...WordLookup) WordLookup {
+ return func(word Word) string {
+ for _, lookup := range lookups {
+ if v := lookup(word); v != "" {
+ return v
+ }
+ }
+ return string(word)
+ }
+}
+
+// LookupEnv функция типа WordLookup которая пытается подставить вместо word
+// соответствующую ему переменную окружения ОС. При этом он срабатывает только
+// если слово начинается со знака `$`.
+func LookupEnv(word Word) string {
+ if !strings.HasPrefix(string(word), "$") {
+ return ""
+ }
+ varName := strings.TrimPrefix(string(word), "$")
+ if result, ok := os.LookupEnv(varName); ok {
+ return result
+ }
+ return ""
+}
+
+// LookupSubst функция типа WordLookup которая пытается подставить вместо word
+// значение из словаря подстановок по соответствующему ключу.
+func LookupSubst(subst map[Word]string) WordLookup {
+ return func(word Word) string {
+ if result, ok := subst[word]; ok {
+ return result
+ }
+ return ""
+ }
+}