12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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")
- for i := 0; i < v.Type().NumField(); i++ {
- ft := v.Type().Field(i)
- fv := v.Field(i)
- if ft.Name[0:1] == strings.ToLower(ft.Name[0:1]) {
- continue // ignore unexported fields
- }
- if (fv.Kind() == reflect.Ptr || fv.Kind() == reflect.Slice) && fv.IsNil() {
- continue // ignore unset fields
- }
- buf.WriteString(strings.Repeat(" ", indent+2))
- buf.WriteString(ft.Name + ": ")
- if tag := ft.Tag.Get("sensitive"); tag == "true" {
- buf.WriteString("<sensitive>")
- } else {
- stringValue(fv, indent+2, buf)
- }
- 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())
- }
- }
|