1package common
2
3import (
4	"errors"
5	"fmt"
6	"os"
7	"strings"
8)
9
10type JobVariable struct {
11	Key      string `json:"key"`
12	Value    string `json:"value"`
13	Public   bool   `json:"public"`
14	Internal bool   `json:"-"`
15	File     bool   `json:"file"`
16	Masked   bool   `json:"masked"`
17	Raw      bool   `json:"raw"`
18}
19
20type JobVariables []JobVariable
21
22func (b JobVariable) String() string {
23	return fmt.Sprintf("%s=%s", b.Key, b.Value)
24}
25
26func (b JobVariables) PublicOrInternal() (variables JobVariables) {
27	for _, variable := range b {
28		if variable.Public || variable.Internal {
29			variables = append(variables, variable)
30		}
31	}
32	return variables
33}
34
35func (b JobVariables) StringList() (variables []string) {
36	for _, variable := range b {
37		variables = append(variables, variable.String())
38	}
39	return variables
40}
41
42func (b JobVariables) Get(key string) string {
43	switch key {
44	case "$":
45		return key
46	case "*", "#", "@", "!", "?", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
47		return ""
48	}
49	for i := len(b) - 1; i >= 0; i-- {
50		if b[i].Key == key {
51			return b[i].Value
52		}
53	}
54	return ""
55}
56
57// OverwriteKey overwrites an existing key with a new variable.
58func (b JobVariables) OverwriteKey(key string, variable JobVariable) {
59	for i, v := range b {
60		if v.Key == key {
61			b[i] = variable
62			return
63		}
64	}
65}
66
67func (b JobVariables) ExpandValue(value string) string {
68	return os.Expand(value, b.Get)
69}
70
71func (b JobVariables) Expand() JobVariables {
72	var variables JobVariables
73	for _, variable := range b {
74		if !variable.Raw {
75			variable.Value = b.ExpandValue(variable.Value)
76		}
77
78		variables = append(variables, variable)
79	}
80	return variables
81}
82
83func (b JobVariables) Masked() (masked []string) {
84	for _, variable := range b {
85		if variable.Masked {
86			masked = append(masked, variable.Value)
87		}
88	}
89	return
90}
91
92func ParseVariable(text string) (variable JobVariable, err error) {
93	keyValue := strings.SplitN(text, "=", 2)
94	if len(keyValue) != 2 {
95		err = errors.New("missing =")
96		return
97	}
98	variable = JobVariable{
99		Key:   keyValue[0],
100		Value: keyValue[1],
101	}
102	return
103}
104