77e69b9cf3
Signed-off-by: Olivier Gambier <olivier@docker.com>
89 lines
1.9 KiB
Go
89 lines
1.9 KiB
Go
package awsutil
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
)
|
|
|
|
// StringValue returns the string representation of a value.
|
|
func StringValue(i interface{}) string {
|
|
var buf bytes.Buffer
|
|
stringValue(reflect.ValueOf(i), 0, &buf)
|
|
return buf.String()
|
|
}
|
|
|
|
func stringValue(v reflect.Value, indent int, buf *bytes.Buffer) {
|
|
for v.Kind() == reflect.Ptr {
|
|
v = v.Elem()
|
|
}
|
|
|
|
switch v.Kind() {
|
|
case reflect.Struct:
|
|
buf.WriteString("{\n")
|
|
|
|
names := []string{}
|
|
for i := 0; i < v.Type().NumField(); i++ {
|
|
name := v.Type().Field(i).Name
|
|
f := v.Field(i)
|
|
if name[0:1] == strings.ToLower(name[0:1]) {
|
|
continue // ignore unexported fields
|
|
}
|
|
if (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice) && f.IsNil() {
|
|
continue // ignore unset fields
|
|
}
|
|
names = append(names, name)
|
|
}
|
|
|
|
for i, n := range names {
|
|
val := v.FieldByName(n)
|
|
buf.WriteString(strings.Repeat(" ", indent+2))
|
|
buf.WriteString(n + ": ")
|
|
stringValue(val, indent+2, buf)
|
|
|
|
if i < len(names)-1 {
|
|
buf.WriteString(",\n")
|
|
}
|
|
}
|
|
|
|
buf.WriteString("\n" + strings.Repeat(" ", indent) + "}")
|
|
case reflect.Slice:
|
|
nl, id, id2 := "", "", ""
|
|
if v.Len() > 3 {
|
|
nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2)
|
|
}
|
|
buf.WriteString("[" + nl)
|
|
for i := 0; i < v.Len(); i++ {
|
|
buf.WriteString(id2)
|
|
stringValue(v.Index(i), indent+2, buf)
|
|
|
|
if i < v.Len()-1 {
|
|
buf.WriteString("," + nl)
|
|
}
|
|
}
|
|
|
|
buf.WriteString(nl + id + "]")
|
|
case reflect.Map:
|
|
buf.WriteString("{\n")
|
|
|
|
for i, k := range v.MapKeys() {
|
|
buf.WriteString(strings.Repeat(" ", indent+2))
|
|
buf.WriteString(k.String() + ": ")
|
|
stringValue(v.MapIndex(k), indent+2, buf)
|
|
|
|
if i < v.Len()-1 {
|
|
buf.WriteString(",\n")
|
|
}
|
|
}
|
|
|
|
buf.WriteString("\n" + strings.Repeat(" ", indent) + "}")
|
|
default:
|
|
format := "%v"
|
|
switch v.Interface().(type) {
|
|
case string:
|
|
format = "%q"
|
|
}
|
|
fmt.Fprintf(buf, format, v.Interface())
|
|
}
|
|
}
|