string_value.go 1.9 KB

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