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