]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go
Initial transfer of provider code
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / aws / aws-sdk-go / aws / awsutil / prettify.go
1 package awsutil
2
3 import (
4 "bytes"
5 "fmt"
6 "io"
7 "reflect"
8 "strings"
9 )
10
11 // Prettify returns the string representation of a value.
12 func Prettify(i interface{}) string {
13 var buf bytes.Buffer
14 prettify(reflect.ValueOf(i), 0, &buf)
15 return buf.String()
16 }
17
18 // prettify will recursively walk value v to build a textual
19 // representation of the value.
20 func prettify(v reflect.Value, indent int, buf *bytes.Buffer) {
21 for v.Kind() == reflect.Ptr {
22 v = v.Elem()
23 }
24
25 switch v.Kind() {
26 case reflect.Struct:
27 strtype := v.Type().String()
28 if strtype == "time.Time" {
29 fmt.Fprintf(buf, "%s", v.Interface())
30 break
31 } else if strings.HasPrefix(strtype, "io.") {
32 buf.WriteString("<buffer>")
33 break
34 }
35
36 buf.WriteString("{\n")
37
38 names := []string{}
39 for i := 0; i < v.Type().NumField(); i++ {
40 name := v.Type().Field(i).Name
41 f := v.Field(i)
42 if name[0:1] == strings.ToLower(name[0:1]) {
43 continue // ignore unexported fields
44 }
45 if (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice || f.Kind() == reflect.Map) && f.IsNil() {
46 continue // ignore unset fields
47 }
48 names = append(names, name)
49 }
50
51 for i, n := range names {
52 val := v.FieldByName(n)
53 buf.WriteString(strings.Repeat(" ", indent+2))
54 buf.WriteString(n + ": ")
55 prettify(val, indent+2, buf)
56
57 if i < len(names)-1 {
58 buf.WriteString(",\n")
59 }
60 }
61
62 buf.WriteString("\n" + strings.Repeat(" ", indent) + "}")
63 case reflect.Slice:
64 strtype := v.Type().String()
65 if strtype == "[]uint8" {
66 fmt.Fprintf(buf, "<binary> len %d", v.Len())
67 break
68 }
69
70 nl, id, id2 := "", "", ""
71 if v.Len() > 3 {
72 nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2)
73 }
74 buf.WriteString("[" + nl)
75 for i := 0; i < v.Len(); i++ {
76 buf.WriteString(id2)
77 prettify(v.Index(i), indent+2, buf)
78
79 if i < v.Len()-1 {
80 buf.WriteString("," + nl)
81 }
82 }
83
84 buf.WriteString(nl + id + "]")
85 case reflect.Map:
86 buf.WriteString("{\n")
87
88 for i, k := range v.MapKeys() {
89 buf.WriteString(strings.Repeat(" ", indent+2))
90 buf.WriteString(k.String() + ": ")
91 prettify(v.MapIndex(k), indent+2, buf)
92
93 if i < v.Len()-1 {
94 buf.WriteString(",\n")
95 }
96 }
97
98 buf.WriteString("\n" + strings.Repeat(" ", indent) + "}")
99 default:
100 if !v.IsValid() {
101 fmt.Fprint(buf, "<invalid value>")
102 return
103 }
104 format := "%v"
105 switch v.Interface().(type) {
106 case string:
107 format = "%q"
108 case io.ReadSeeker, io.Reader:
109 format = "buffer(%p)"
110 }
111 fmt.Fprintf(buf, format, v.Interface())
112 }
113 }