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
|
package forms
import (
"regexp"
"strings"
)
type Select struct {
Prompt string
Options []Option
}
type Ask struct {
Prompt string
Multiline bool
Uppercase bool
}
type Option struct {
Item string
Value string
}
func promptAsks(str string, promptFn func(Ask) string) string {
re := regexp.MustCompile(`(?i)<Ask\s+([^,]+)(,[^>]+)?>`)
for {
tokens := re.FindAllStringSubmatch(str, -1)
if len(tokens) == 0 {
return str
}
replace, prompt, options := tokens[0][0], tokens[0][1], strings.TrimPrefix(tokens[0][2], ",")
a := Ask{
Prompt: prompt,
Multiline: strings.EqualFold(options, "MU"),
Uppercase: strings.EqualFold(options, "UP"),
}
ans := promptFn(a)
str = strings.Replace(str, replace, ans, 1)
}
}
func promptSelects(str string, promptFn func(Select) Option) string {
re := regexp.MustCompile(`(?i)<Select\s+([^,]+)(,[^>]+)?>`)
for {
tokens := re.FindAllStringSubmatch(str, -1)
if len(tokens) == 0 {
return str
}
replace, prompt, options := tokens[0][0], tokens[0][1], strings.Split(strings.TrimPrefix(tokens[0][2], ","), ",")
s := Select{Prompt: prompt}
for _, opt := range options {
item, value, ok := strings.Cut(opt, "=")
if !ok {
value = item
}
s.Options = append(s.Options, Option{Item: item, Value: value})
}
ans := promptFn(s)
str = strings.Replace(str, replace, ans.Value, 1)
}
}
func promptVars(str string, promptFn func(string) string) string {
re := regexp.MustCompile(`(?i)<Var\s+(\w+)\s*>`)
for {
tokens := re.FindAllStringSubmatch(str, -1)
if len(tokens) == 0 {
return str
}
replace, key := tokens[0][0], tokens[0][1]
ans := promptFn(key)
if ans == "" {
ans = "blank"
}
str = strings.Replace(str, replace, ans, 1)
}
}
|