1package rest 2 3import "reflect" 4 5// PayloadMember returns the payload field member of i if there is one, or nil. 6func 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// PayloadType returns the type of a payload field member of i if there is one, or "". 32func PayloadType(i interface{}) string { 33 v := reflect.Indirect(reflect.ValueOf(i)) 34 if !v.IsValid() { 35 return "" 36 } 37 if field, ok := v.Type().FieldByName("_"); ok { 38 if payloadName := field.Tag.Get("payload"); payloadName != "" { 39 if member, ok := v.Type().FieldByName(payloadName); ok { 40 return member.Tag.Get("type") 41 } 42 } 43 } 44 return "" 45} 46