File: prompt.go

package info (click to toggle)
pat 0.19.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,228 kB
  • sloc: javascript: 3,864; sh: 147; makefile: 11
file content (77 lines) | stat: -rw-r--r-- 1,750 bytes parent folder | download | duplicates (2)
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)
	}
}