]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package awsutil |
2 | ||
3 | import ( | |
4 | "bytes" | |
5 | "fmt" | |
6 | "reflect" | |
7 | "strings" | |
8 | ) | |
9 | ||
10 | // StringValue returns the string representation of a value. | |
11 | func StringValue(i interface{}) string { | |
12 | var buf bytes.Buffer | |
13 | stringValue(reflect.ValueOf(i), 0, &buf) | |
14 | return buf.String() | |
15 | } | |
16 | ||
17 | func stringValue(v reflect.Value, indent int, buf *bytes.Buffer) { | |
18 | for v.Kind() == reflect.Ptr { | |
19 | v = v.Elem() | |
20 | } | |
21 | ||
22 | switch v.Kind() { | |
23 | case reflect.Struct: | |
24 | buf.WriteString("{\n") | |
25 | ||
bae9f6d2 | 26 | for i := 0; i < v.Type().NumField(); i++ { |
107c1cdb ND |
27 | ft := v.Type().Field(i) |
28 | fv := v.Field(i) | |
29 | ||
30 | if ft.Name[0:1] == strings.ToLower(ft.Name[0:1]) { | |
bae9f6d2 JC |
31 | continue // ignore unexported fields |
32 | } | |
107c1cdb | 33 | if (fv.Kind() == reflect.Ptr || fv.Kind() == reflect.Slice) && fv.IsNil() { |
bae9f6d2 JC |
34 | continue // ignore unset fields |
35 | } | |
bae9f6d2 | 36 | |
bae9f6d2 | 37 | buf.WriteString(strings.Repeat(" ", indent+2)) |
107c1cdb | 38 | buf.WriteString(ft.Name + ": ") |
bae9f6d2 | 39 | |
107c1cdb ND |
40 | if tag := ft.Tag.Get("sensitive"); tag == "true" { |
41 | buf.WriteString("<sensitive>") | |
42 | } else { | |
43 | stringValue(fv, indent+2, buf) | |
bae9f6d2 | 44 | } |
107c1cdb ND |
45 | |
46 | buf.WriteString(",\n") | |
bae9f6d2 JC |
47 | } |
48 | ||
49 | buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") | |
50 | case reflect.Slice: | |
51 | nl, id, id2 := "", "", "" | |
52 | if v.Len() > 3 { | |
53 | nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2) | |
54 | } | |
55 | buf.WriteString("[" + nl) | |
56 | for i := 0; i < v.Len(); i++ { | |
57 | buf.WriteString(id2) | |
58 | stringValue(v.Index(i), indent+2, buf) | |
59 | ||
60 | if i < v.Len()-1 { | |
61 | buf.WriteString("," + nl) | |
62 | } | |
63 | } | |
64 | ||
65 | buf.WriteString(nl + id + "]") | |
66 | case reflect.Map: | |
67 | buf.WriteString("{\n") | |
68 | ||
69 | for i, k := range v.MapKeys() { | |
70 | buf.WriteString(strings.Repeat(" ", indent+2)) | |
71 | buf.WriteString(k.String() + ": ") | |
72 | stringValue(v.MapIndex(k), indent+2, buf) | |
73 | ||
74 | if i < v.Len()-1 { | |
75 | buf.WriteString(",\n") | |
76 | } | |
77 | } | |
78 | ||
79 | buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") | |
80 | default: | |
81 | format := "%v" | |
82 | switch v.Interface().(type) { | |
83 | case string: | |
84 | format = "%q" | |
85 | } | |
86 | fmt.Fprintf(buf, format, v.Interface()) | |
87 | } | |
88 | } |