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  }