|
| 1 | +package apidesc |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + |
| 6 | + "gopkg.in/yaml.v3" |
| 7 | +) |
| 8 | + |
| 9 | +type NamedPathParam struct { |
| 10 | + Documentation string `yaml:"documentation,omitempty"` // URL 路径参数文档 |
| 11 | + PathSegment string `yaml:"path_segment,omitempty"` // URL 路径段落,如果为空,则表示参数直接追加在 URL 路径末尾 |
| 12 | + FieldName string `yaml:"field_name,omitempty"` // URL 路径参数名称 |
| 13 | + FieldCamelCaseName string `yaml:"field_camel_case_name,omitempty"` // URL 路径参数驼峰命名 |
| 14 | + FieldSnakeCaseName string `yaml:"field_snake_case_name,omitempty"` // URL 路径参数下划线命名 |
| 15 | + Type *StringLikeType `yaml:"type,omitempty"` // URL 路径参数类型 |
| 16 | + Encode *EncodeType `yaml:"encode,omitempty"` // URL 路径参数编码方式,如果为空,表示直接转码成字符串 |
| 17 | + ServiceBucket *ServiceBucketType `yaml:"service_bucket,omitempty"` // URL 路径参数是否是空间名称,如果为空,则表示不是,如果不为空,则填写格式 |
| 18 | + ServiceObject *ServiceObjectType `yaml:"service_object,omitempty"` // URL 路径参数是否是对象名称,如果为空,则表示不是,如果不为空,则填写格式 |
| 19 | + Optional *OptionalType `yaml:"optional,omitempty"` // URL 路径参数是否可选,如果为空,则表示必填 |
| 20 | +} |
| 21 | + |
| 22 | +type FreePathParams struct { |
| 23 | + FieldName string `yaml:"field_name,omitempty"` // URL 路径参数名称 |
| 24 | + FieldCamelCaseName string `yaml:"field_camel_case_name,omitempty"` // URL 路径参数驼峰命名 |
| 25 | + FieldSnakeCaseName string `yaml:"field_snake_case_name,omitempty"` // URL 路径参数下划线命名 |
| 26 | + Documentation string `yaml:"documentation,omitempty"` // URL 路径参数文档 |
| 27 | + EncodeParamKey *EncodeType `yaml:"encode_param_key"` // URL 路径参数键编码方式,如果为空,表示直接转码成字符串 |
| 28 | + EncodeParamValue *EncodeType `yaml:"encode_param_value"` // URL 路径参数值编码方式,如果为空,表示直接转码成字符串 |
| 29 | +} |
| 30 | + |
| 31 | +type PathParams struct { |
| 32 | + Named []NamedPathParam `yaml:"named,omitempty"` // URL 路径有名参数列表 |
| 33 | + Free *FreePathParams `yaml:"free,omitempty"` // URL 路径自由参数列表 |
| 34 | +} |
| 35 | + |
| 36 | +type RequestBody struct { |
| 37 | + Json *JsonType `yaml:"json,omitempty"` // JSON 类型 |
| 38 | + FormUrlencoded *FormUrlencodedRequestStruct `yaml:"form_urlencoded,omitempty"` // URL 编码表单调用(无法上传二进制数据) |
| 39 | + MultipartFormData *MultipartFormFields `yaml:"multipart_form_data,omitempty"` // 复合表单调用(可以上传二进制数据) |
| 40 | + BinaryData bool `yaml:"binary_data,omitempty"` // 二进制数据 |
| 41 | +} |
| 42 | + |
| 43 | +func (body *RequestBody) UnmarshalYAML(value *yaml.Node) error { |
| 44 | + switch value.ShortTag() { |
| 45 | + case "!!str": |
| 46 | + switch value.Value { |
| 47 | + case "binary_data": |
| 48 | + body.BinaryData = true |
| 49 | + default: |
| 50 | + return fmt.Errorf("unknown request body type: %s", value.Value) |
| 51 | + } |
| 52 | + return nil |
| 53 | + case "!!map": |
| 54 | + switch value.Content[0].Value { |
| 55 | + case "json": |
| 56 | + return value.Content[1].Decode(&body.Json) |
| 57 | + case "form_urlencoded": |
| 58 | + return value.Content[1].Decode(&body.FormUrlencoded) |
| 59 | + case "multipart_form_data": |
| 60 | + return value.Content[1].Decode(&body.MultipartFormData) |
| 61 | + default: |
| 62 | + return fmt.Errorf("unknown request body type: %s", value.Content[0].Value) |
| 63 | + } |
| 64 | + default: |
| 65 | + return fmt.Errorf("unknown request body type: %s", value.ShortTag()) |
| 66 | + } |
| 67 | +} |
| 68 | + |
| 69 | +type ApiRequestDescription struct { |
| 70 | + PathParams *PathParams `yaml:"path_params,omitempty"` // URL 路径参数列表 |
| 71 | + HeaderNames HeaderNames `yaml:"header_names,omitempty"` // HTTP 头参数列表 |
| 72 | + QueryNames QueryNames `yaml:"query_names,omitempty"` // URL 查询参数列表 |
| 73 | + Body *RequestBody `yaml:"body,omitempty"` // 请求体 |
| 74 | + Authorization *Authorization `yaml:"authorization,omitempty"` // 鉴权参数 |
| 75 | + Idempotent *Idempotent `yaml:"idempotent,omitempty"` // 幂等性 |
| 76 | + responseTypeRequired bool `yaml:"response_type_required"` // |
| 77 | +} |
0 commit comments