/
format.go
55 lines (50 loc) · 1.33 KB
/
format.go
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
package forgelib
import (
"bytes"
"fmt"
"reflect"
"strconv"
"github.com/aws/aws-sdk-go/service/sts"
)
func valueToString(v interface{}, dest *string, allowSlices bool, allowCommas bool) error {
if allowSlices && reflect.TypeOf(v).Kind() == reflect.Slice {
var buffer bytes.Buffer
vv := reflect.ValueOf(v)
for i := 0; i < vv.Len(); i++ {
var thisOutput string
if err := valueToString(vv.Index(i).Interface(), &thisOutput, false, false); err != nil {
return err
}
if buffer.Len() > 0 {
buffer.WriteByte(',')
}
buffer.WriteString(thisOutput)
}
*dest = buffer.String()
return nil
}
switch vv := v.(type) {
case string:
for _, b := range vv {
if !allowCommas && b == ',' {
return fmt.Errorf("Commas not allowed in list values")
}
}
*dest = vv
// float64 also captures integers from YAML/JSON
case float64:
*dest = strconv.FormatFloat(vv, 'f', -1, 64)
case bool:
*dest = strconv.FormatBool(vv)
default:
return fmt.Errorf("Field of type %s is not allowed", reflect.TypeOf(vv).Kind().String())
}
return nil
}
func roleARNFromName(roleName string) (output string, err error) {
callerIdentity, err := stsClient.GetCallerIdentity(&sts.GetCallerIdentityInput{})
if err != nil {
return output, err
}
return fmt.Sprintf("arn:aws:iam::%s:role/%s", *callerIdentity.Account, roleName), err
}