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  }