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