payload.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package rest
  2. import (
  3. "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. v := reflect.ValueOf(i).Elem()
  11. if !v.IsValid() {
  12. return nil
  13. }
  14. if field, ok := v.Type().FieldByName("SDKShapeTraits"); ok {
  15. if payloadName := field.Tag.Get("payload"); payloadName != "" {
  16. field, _ := v.Type().FieldByName(payloadName)
  17. if field.Tag.Get("type") != "structure" {
  18. return nil
  19. }
  20. payload := v.FieldByName(payloadName)
  21. if payload.IsValid() || (payload.Kind() == reflect.Ptr && !payload.IsNil()) {
  22. return payload.Interface()
  23. }
  24. }
  25. }
  26. return nil
  27. }
  28. // PayloadType returns the type of a payload field member of i if there is one, or "".
  29. func PayloadType(i interface{}) string {
  30. v := reflect.Indirect(reflect.ValueOf(i))
  31. if !v.IsValid() {
  32. return ""
  33. }
  34. if field, ok := v.Type().FieldByName("SDKShapeTraits"); ok {
  35. if payloadName := field.Tag.Get("payload"); payloadName != "" {
  36. if payloadName == "GetBucketCORSInput" {
  37. return field.Tag.Get("type")
  38. }
  39. if member, ok := v.Type().FieldByName(payloadName); ok {
  40. return member.Tag.Get("type")
  41. }
  42. }
  43. }
  44. return ""
  45. }
  46. // PayloadMd5 判断给定结构体 i 中是否有 AutoFillMD5 字段
  47. func PayloadMd5(i interface{}) (hasField bool) {
  48. // 获取结构体指针的 Value
  49. v := reflect.Indirect(reflect.ValueOf(i))
  50. // 如果结构体不存在或为空,则直接返回 false
  51. if !v.IsValid() {
  52. return
  53. }
  54. // 判断是否存在 AutoFillMD5 字段
  55. _, hasField = v.Type().FieldByName("AutoFillMD5")
  56. return
  57. }