...

Source file src/github.com/aws/aws-sdk-go-v2/internal/awsutil/string_value.go

Documentation: github.com/aws/aws-sdk-go-v2/internal/awsutil

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

View as plain text