podman
236 строк · 4.5 Кб
1package sprig
2
3import (
4"encoding/base32"
5"encoding/base64"
6"fmt"
7"reflect"
8"strconv"
9"strings"
10
11util "github.com/Masterminds/goutils"
12)
13
14func base64encode(v string) string {
15return base64.StdEncoding.EncodeToString([]byte(v))
16}
17
18func base64decode(v string) string {
19data, err := base64.StdEncoding.DecodeString(v)
20if err != nil {
21return err.Error()
22}
23return string(data)
24}
25
26func base32encode(v string) string {
27return base32.StdEncoding.EncodeToString([]byte(v))
28}
29
30func base32decode(v string) string {
31data, err := base32.StdEncoding.DecodeString(v)
32if err != nil {
33return err.Error()
34}
35return string(data)
36}
37
38func abbrev(width int, s string) string {
39if width < 4 {
40return s
41}
42r, _ := util.Abbreviate(s, width)
43return r
44}
45
46func abbrevboth(left, right int, s string) string {
47if right < 4 || left > 0 && right < 7 {
48return s
49}
50r, _ := util.AbbreviateFull(s, left, right)
51return r
52}
53func initials(s string) string {
54// Wrap this just to eliminate the var args, which templates don't do well.
55return util.Initials(s)
56}
57
58func randAlphaNumeric(count int) string {
59// It is not possible, it appears, to actually generate an error here.
60r, _ := util.CryptoRandomAlphaNumeric(count)
61return r
62}
63
64func randAlpha(count int) string {
65r, _ := util.CryptoRandomAlphabetic(count)
66return r
67}
68
69func randAscii(count int) string {
70r, _ := util.CryptoRandomAscii(count)
71return r
72}
73
74func randNumeric(count int) string {
75r, _ := util.CryptoRandomNumeric(count)
76return r
77}
78
79func untitle(str string) string {
80return util.Uncapitalize(str)
81}
82
83func quote(str ...interface{}) string {
84out := make([]string, 0, len(str))
85for _, s := range str {
86if s != nil {
87out = append(out, fmt.Sprintf("%q", strval(s)))
88}
89}
90return strings.Join(out, " ")
91}
92
93func squote(str ...interface{}) string {
94out := make([]string, 0, len(str))
95for _, s := range str {
96if s != nil {
97out = append(out, fmt.Sprintf("'%v'", s))
98}
99}
100return strings.Join(out, " ")
101}
102
103func cat(v ...interface{}) string {
104v = removeNilElements(v)
105r := strings.TrimSpace(strings.Repeat("%v ", len(v)))
106return fmt.Sprintf(r, v...)
107}
108
109func indent(spaces int, v string) string {
110pad := strings.Repeat(" ", spaces)
111return pad + strings.Replace(v, "\n", "\n"+pad, -1)
112}
113
114func nindent(spaces int, v string) string {
115return "\n" + indent(spaces, v)
116}
117
118func replace(old, new, src string) string {
119return strings.Replace(src, old, new, -1)
120}
121
122func plural(one, many string, count int) string {
123if count == 1 {
124return one
125}
126return many
127}
128
129func strslice(v interface{}) []string {
130switch v := v.(type) {
131case []string:
132return v
133case []interface{}:
134b := make([]string, 0, len(v))
135for _, s := range v {
136if s != nil {
137b = append(b, strval(s))
138}
139}
140return b
141default:
142val := reflect.ValueOf(v)
143switch val.Kind() {
144case reflect.Array, reflect.Slice:
145l := val.Len()
146b := make([]string, 0, l)
147for i := 0; i < l; i++ {
148value := val.Index(i).Interface()
149if value != nil {
150b = append(b, strval(value))
151}
152}
153return b
154default:
155if v == nil {
156return []string{}
157}
158
159return []string{strval(v)}
160}
161}
162}
163
164func removeNilElements(v []interface{}) []interface{} {
165newSlice := make([]interface{}, 0, len(v))
166for _, i := range v {
167if i != nil {
168newSlice = append(newSlice, i)
169}
170}
171return newSlice
172}
173
174func strval(v interface{}) string {
175switch v := v.(type) {
176case string:
177return v
178case []byte:
179return string(v)
180case error:
181return v.Error()
182case fmt.Stringer:
183return v.String()
184default:
185return fmt.Sprintf("%v", v)
186}
187}
188
189func trunc(c int, s string) string {
190if c < 0 && len(s)+c > 0 {
191return s[len(s)+c:]
192}
193if c >= 0 && len(s) > c {
194return s[:c]
195}
196return s
197}
198
199func join(sep string, v interface{}) string {
200return strings.Join(strslice(v), sep)
201}
202
203func split(sep, orig string) map[string]string {
204parts := strings.Split(orig, sep)
205res := make(map[string]string, len(parts))
206for i, v := range parts {
207res["_"+strconv.Itoa(i)] = v
208}
209return res
210}
211
212func splitn(sep string, n int, orig string) map[string]string {
213parts := strings.SplitN(orig, sep, n)
214res := make(map[string]string, len(parts))
215for i, v := range parts {
216res["_"+strconv.Itoa(i)] = v
217}
218return res
219}
220
221// substring creates a substring of the given string.
222//
223// If start is < 0, this calls string[:end].
224//
225// If start is >= 0 and end < 0 or end bigger than s length, this calls string[start:]
226//
227// Otherwise, this calls string[start, end].
228func substring(start, end int, s string) string {
229if start < 0 {
230return s[:end]
231}
232if end < 0 || end > len(s) {
233return s[start:]
234}
235return s[start:end]
236}
237