github.com/aavshr/aws-sdk-go@v1.41.3/aws/awsutil/string_value.go (about)

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