github.com/qiniu/go-sdk/v7@v7.27.0/internal/api-generator/request.go (about) 1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/dave/jennifer/jen" 8 "gopkg.in/yaml.v3" 9 ) 10 11 type ( 12 ApiRequestDescription struct { 13 PathParams *PathParams `yaml:"path_params,omitempty"` 14 HeaderNames HeaderNames `yaml:"header_names,omitempty"` 15 QueryNames QueryNames `yaml:"query_names,omitempty"` 16 Body *RequestBody `yaml:"body,omitempty"` 17 Authorization *Authorization `yaml:"authorization,omitempty"` 18 Idempotent *Idempotent `yaml:"idempotent,omitempty"` 19 responseTypeRequired bool 20 } 21 22 RequestBody struct { 23 Json *JsonType 24 FormUrlencoded *FormUrlencodedRequestStruct 25 MultipartFormData *MultipartFormFields 26 BinaryData bool 27 } 28 ) 29 30 func (request *ApiRequestDescription) generate(group *jen.Group, opts CodeGeneratorOptions) (err error) { 31 if opts.Documentation != "" { 32 group.Add(jen.Comment(opts.Documentation)) 33 } 34 group.Add(jen.Type(). 35 Id(opts.camelCaseName()). 36 StructFunc(func(group *jen.Group) { 37 err = request.addFields(group) 38 })) 39 if err != nil { 40 return 41 } 42 43 if body := request.Body; body != nil { 44 if bodyJson := body.Json; bodyJson != nil { 45 err = bodyJson.generate(group, opts) 46 } 47 } 48 49 return 50 } 51 52 func (request *ApiRequestDescription) addFields(group *jen.Group) (err error) { 53 if pp := request.PathParams; pp != nil { 54 if err = pp.addFields(group); err != nil { 55 return 56 } 57 } 58 if names := request.QueryNames; names != nil { 59 if err = names.addFields(group); err != nil { 60 return 61 } 62 } 63 if names := request.HeaderNames; names != nil { 64 if err = names.addFields(group); err != nil { 65 return 66 } 67 } 68 if authorization := request.Authorization; authorization != nil { 69 switch authorization.ToAuthorization() { 70 case AuthorizationQbox, AuthorizationQiniu: 71 group.Add(jen.Id("Credentials").Qual(PackageNameCredentials, "CredentialsProvider").Comment("鉴权参数,用于生成鉴权凭证,如果为空,则使用 HTTPClientOptions 中的 CredentialsProvider")) 72 case AuthorizationUpToken: 73 group.Add(jen.Id("UpToken").Qual(PackageNameUpToken, "Provider").Comment("上传凭证,如果为空,则使用 HTTPClientOptions 中的 UpToken")) 74 } 75 } 76 if body := request.Body; body != nil { 77 if bodyJson := body.Json; bodyJson != nil { 78 if jsonStruct := bodyJson.Struct; jsonStruct != nil { 79 if err = jsonStruct.addFields(group, false); err != nil { 80 return 81 } 82 } else if jsonArray := bodyJson.Array; jsonArray != nil { 83 if err = jsonArray.addFields(group); err != nil { 84 return 85 } 86 } else { 87 return errors.New("request body should be struct or array") 88 } 89 } else if formUrlencoded := body.FormUrlencoded; formUrlencoded != nil { 90 if err = formUrlencoded.addFields(group); err != nil { 91 return 92 } 93 } else if multipartFormData := body.MultipartFormData; multipartFormData != nil { 94 if err = multipartFormData.addFields(group); err != nil { 95 return 96 } 97 } else if body.BinaryData { 98 group.Add(jen.Id("Body").Qual(PackageNameInternalIo, "ReadSeekCloser").Comment("请求体")) 99 } 100 } 101 if request.responseTypeRequired { 102 group.Add(jen.Id("ResponseBody").Interface().Comment("响应体,如果为空,则 Response.Body 的类型由 encoding/json 库决定")) 103 } 104 return 105 } 106 107 func (request *ApiRequestDescription) generateGetAccessKeyFunc(group *jen.Group, structName string) (err error) { 108 group.Add( 109 jen.Func(). 110 Params(jen.Id("request").Op("*").Id(structName)). 111 Id("getAccessKey"). 112 Params(jen.Id("ctx").Qual("context", "Context")). 113 Params(jen.Id("string"), jen.Error()). 114 BlockFunc(func(group *jen.Group) { 115 if authorization := request.Authorization; authorization != nil { 116 switch authorization.ToAuthorization() { 117 case AuthorizationQbox, AuthorizationQiniu: 118 group.Add( 119 jen.If(jen.Id("request").Dot("Credentials").Op("!=").Nil()).BlockFunc(func(group *jen.Group) { 120 group.Add( 121 jen.If( 122 jen.List(jen.Id("credentials"), jen.Err()). 123 Op(":="). 124 Id("request"). 125 Dot("Credentials"). 126 Dot("Get"). 127 Call(jen.Id("ctx")), 128 jen.Err().Op("!=").Nil(), 129 ).BlockFunc(func(group *jen.Group) { 130 group.Return(jen.Lit(""), jen.Err()) 131 }).Else().BlockFunc(func(group *jen.Group) { 132 group.Return(jen.Id("credentials").Dot("AccessKey"), jen.Nil()) 133 }), 134 ) 135 }), 136 ) 137 case AuthorizationUpToken: 138 group.Add( 139 jen.If(jen.Id("request").Dot("UpToken").Op("!=").Nil()).BlockFunc(func(group *jen.Group) { 140 group.Return(jen.Id("request").Dot("UpToken").Dot("GetAccessKey").Call(jen.Id("ctx"))) 141 }), 142 ) 143 } 144 } 145 if body := request.Body; body != nil { 146 if multipartForm := body.MultipartFormData; multipartForm != nil { 147 if field := multipartForm.getServiceBucketField(); field != nil && field.ServiceBucket.ToServiceBucketType() != ServiceBucketTypeNone { 148 fieldName := field.camelCaseName() 149 group.Add( 150 jen.If(jen.Id("request").Dot(fieldName).Op("!=").Nil()).BlockFunc(func(group *jen.Group) { 151 group.If( 152 jen.List(jen.Id("accessKey"), jen.Err()). 153 Op(":="). 154 Id("request"). 155 Dot(fieldName). 156 Dot("GetAccessKey"). 157 Call(jen.Id("ctx")), 158 jen.Err().Op("!=").Nil(), 159 ).BlockFunc(func(group *jen.Group) { 160 group.Add(jen.Return(jen.Lit(""), jen.Err())) 161 }).Else().BlockFunc(func(group *jen.Group) { 162 group.Add(jen.Return(jen.Id("accessKey"), jen.Nil())) 163 }) 164 }), 165 ) 166 } 167 } 168 } 169 group.Add(jen.Return(jen.Lit(""), jen.Nil())) 170 }), 171 ) 172 return 173 } 174 175 func (body *RequestBody) UnmarshalYAML(value *yaml.Node) error { 176 switch value.ShortTag() { 177 case "!!str": 178 switch value.Value { 179 case "binary_data": 180 body.BinaryData = true 181 default: 182 return fmt.Errorf("unknown request body type: %s", value.Value) 183 } 184 return nil 185 case "!!map": 186 switch value.Content[0].Value { 187 case "json": 188 return value.Content[1].Decode(&body.Json) 189 case "form_urlencoded": 190 return value.Content[1].Decode(&body.FormUrlencoded) 191 case "multipart_form_data": 192 return value.Content[1].Decode(&body.MultipartFormData) 193 default: 194 return fmt.Errorf("unknown request body type: %s", value.Content[0].Value) 195 } 196 default: 197 return fmt.Errorf("unknown request body type: %s", value.ShortTag()) 198 } 199 }