github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/rest/payload.go (about) 1 package rest 2 3 import "reflect" 4 5 // PayloadMember returns the payload field member of i if there is one, or nil. 6 func PayloadMember(i interface{}) interface{} { 7 if i == nil { 8 return nil 9 } 10 11 v := reflect.ValueOf(i).Elem() 12 if !v.IsValid() { 13 return nil 14 } 15 if field, ok := v.Type().FieldByName("_"); ok { 16 if payloadName := field.Tag.Get("payload"); payloadName != "" { 17 field, _ := v.Type().FieldByName(payloadName) 18 if field.Tag.Get("type") != "structure" { 19 return nil 20 } 21 22 payload := v.FieldByName(payloadName) 23 if payload.IsValid() || (payload.Kind() == reflect.Ptr && !payload.IsNil()) { 24 return payload.Interface() 25 } 26 } 27 } 28 return nil 29 } 30 31 const nopayloadPayloadType = "nopayload" 32 33 // PayloadType returns the type of a payload field member of i if there is one, 34 // or "". 35 func PayloadType(i interface{}) string { 36 v := reflect.Indirect(reflect.ValueOf(i)) 37 if !v.IsValid() { 38 return "" 39 } 40 41 if field, ok := v.Type().FieldByName("_"); ok { 42 if noPayload := field.Tag.Get(nopayloadPayloadType); noPayload != "" { 43 return nopayloadPayloadType 44 } 45 46 if payloadName := field.Tag.Get("payload"); payloadName != "" { 47 if member, ok := v.Type().FieldByName(payloadName); ok { 48 return member.Tag.Get("type") 49 } 50 } 51 } 52 53 return "" 54 }