podman
189 строк · 3.6 Кб
1package sprig
2
3import (
4"encoding/base32"
5"encoding/base64"
6"fmt"
7"reflect"
8"strconv"
9"strings"
10)
11
12func base64encode(v string) string {
13return base64.StdEncoding.EncodeToString([]byte(v))
14}
15
16func base64decode(v string) string {
17data, err := base64.StdEncoding.DecodeString(v)
18if err != nil {
19return err.Error()
20}
21return string(data)
22}
23
24func base32encode(v string) string {
25return base32.StdEncoding.EncodeToString([]byte(v))
26}
27
28func base32decode(v string) string {
29data, err := base32.StdEncoding.DecodeString(v)
30if err != nil {
31return err.Error()
32}
33return string(data)
34}
35
36func quote(str ...interface{}) string {
37out := make([]string, 0, len(str))
38for _, s := range str {
39if s != nil {
40out = append(out, fmt.Sprintf("%q", strval(s)))
41}
42}
43return strings.Join(out, " ")
44}
45
46func squote(str ...interface{}) string {
47out := make([]string, 0, len(str))
48for _, s := range str {
49if s != nil {
50out = append(out, fmt.Sprintf("'%v'", s))
51}
52}
53return strings.Join(out, " ")
54}
55
56func cat(v ...interface{}) string {
57v = removeNilElements(v)
58r := strings.TrimSpace(strings.Repeat("%v ", len(v)))
59return fmt.Sprintf(r, v...)
60}
61
62func indent(spaces int, v string) string {
63pad := strings.Repeat(" ", spaces)
64return pad + strings.Replace(v, "\n", "\n"+pad, -1)
65}
66
67func nindent(spaces int, v string) string {
68return "\n" + indent(spaces, v)
69}
70
71func replace(old, new, src string) string {
72return strings.Replace(src, old, new, -1)
73}
74
75func plural(one, many string, count int) string {
76if count == 1 {
77return one
78}
79return many
80}
81
82func strslice(v interface{}) []string {
83switch v := v.(type) {
84case []string:
85return v
86case []interface{}:
87b := make([]string, 0, len(v))
88for _, s := range v {
89if s != nil {
90b = append(b, strval(s))
91}
92}
93return b
94default:
95val := reflect.ValueOf(v)
96switch val.Kind() {
97case reflect.Array, reflect.Slice:
98l := val.Len()
99b := make([]string, 0, l)
100for i := 0; i < l; i++ {
101value := val.Index(i).Interface()
102if value != nil {
103b = append(b, strval(value))
104}
105}
106return b
107default:
108if v == nil {
109return []string{}
110}
111
112return []string{strval(v)}
113}
114}
115}
116
117func removeNilElements(v []interface{}) []interface{} {
118newSlice := make([]interface{}, 0, len(v))
119for _, i := range v {
120if i != nil {
121newSlice = append(newSlice, i)
122}
123}
124return newSlice
125}
126
127func strval(v interface{}) string {
128switch v := v.(type) {
129case string:
130return v
131case []byte:
132return string(v)
133case error:
134return v.Error()
135case fmt.Stringer:
136return v.String()
137default:
138return fmt.Sprintf("%v", v)
139}
140}
141
142func trunc(c int, s string) string {
143if c < 0 && len(s)+c > 0 {
144return s[len(s)+c:]
145}
146if c >= 0 && len(s) > c {
147return s[:c]
148}
149return s
150}
151
152func join(sep string, v interface{}) string {
153return strings.Join(strslice(v), sep)
154}
155
156func split(sep, orig string) map[string]string {
157parts := strings.Split(orig, sep)
158res := make(map[string]string, len(parts))
159for i, v := range parts {
160res["_"+strconv.Itoa(i)] = v
161}
162return res
163}
164
165func splitn(sep string, n int, orig string) map[string]string {
166parts := strings.SplitN(orig, sep, n)
167res := make(map[string]string, len(parts))
168for i, v := range parts {
169res["_"+strconv.Itoa(i)] = v
170}
171return res
172}
173
174// substring creates a substring of the given string.
175//
176// If start is < 0, this calls string[:end].
177//
178// If start is >= 0 and end < 0 or end bigger than s length, this calls string[start:]
179//
180// Otherwise, this calls string[start, end].
181func substring(start, end int, s string) string {
182if start < 0 {
183return s[:end]
184}
185if end < 0 || end > len(s) {
186return s[start:]
187}
188return s[start:end]
189}
190