github.com/qiniu/go-sdk/v7@v7.27.0/internal/api-generator/headers.go (about)

     1  package main
     2  
     3  import (
     4  	"github.com/dave/jennifer/jen"
     5  	"github.com/iancoleman/strcase"
     6  )
     7  
     8  type (
     9  	HeaderName struct {
    10  		FieldName          string        `yaml:"field_name,omitempty"`
    11  		FieldCamelCaseName string        `yaml:"field_camel_case_name,omitempty"`
    12  		FieldSnakeCaseName string        `yaml:"field_snake_case_name,omitempty"`
    13  		HeaderName         string        `yaml:"header_name,omitempty"`
    14  		Documentation      string        `yaml:"documentation,omitempty"`
    15  		Optional           *OptionalType `yaml:"optional,omitempty"`
    16  	}
    17  	HeaderNames []HeaderName
    18  )
    19  
    20  func (name *HeaderName) camelCaseName() string {
    21  	if name.FieldCamelCaseName != "" {
    22  		return name.FieldCamelCaseName
    23  	}
    24  	return strcase.ToCamel(name.FieldName)
    25  }
    26  
    27  func (names HeaderNames) addFields(group *jen.Group) error {
    28  	for _, headerName := range names {
    29  		code := jen.Id(headerName.camelCaseName())
    30  		if headerName.Optional.ToOptionalType() == OptionalTypeNullable {
    31  			code = code.Op("*")
    32  		}
    33  		code = code.String()
    34  		if headerName.Documentation != "" {
    35  			code = code.Comment(headerName.Documentation)
    36  		}
    37  		group.Add(code)
    38  	}
    39  	return nil
    40  }
    41  
    42  func (names HeaderNames) addGetBucketNameFunc(group *jen.Group, structName string) (bool, error) {
    43  	return false, nil
    44  }
    45  
    46  func (names HeaderNames) addGetObjectNameFunc(group *jen.Group, structName string) (bool, error) {
    47  	return false, nil
    48  }
    49  
    50  func (names HeaderNames) addBuildFunc(group *jen.Group, structName string) error {
    51  	group.Add(
    52  		jen.Func().
    53  			Params(jen.Id("headers").Op("*").Id(structName)).
    54  			Id("buildHeaders").
    55  			Params().
    56  			Params(jen.Qual("net/http", "Header"), jen.Error()).
    57  			BlockFunc(func(group *jen.Group) {
    58  				group.Add(
    59  					jen.Id("allHeaders").Op(":=").Make(jen.Qual("net/http", "Header")),
    60  				)
    61  				for _, headerName := range names {
    62  					fieldName := headerName.camelCaseName()
    63  					cond := jen.Id("headers").Dot(fieldName)
    64  					if headerName.Optional.ToOptionalType() == OptionalTypeNullable {
    65  						cond = cond.Op("!=").Nil()
    66  					} else {
    67  						cond = cond.Op("!=").Lit("")
    68  					}
    69  					setHeaderFunc := func(headerName, fieldName string) func(*jen.Group) {
    70  						return func(group *jen.Group) {
    71  							group.Add(jen.Id("allHeaders").Dot("Set").Call(jen.Lit(headerName), jen.Id("headers").Dot(fieldName)))
    72  						}
    73  					}
    74  					appendMissingRequiredFieldErrorFunc := func(fieldName string) func(group *jen.Group) {
    75  						return func(group *jen.Group) {
    76  							group.Add(jen.Return(
    77  								jen.Nil(),
    78  								jen.Qual(PackageNameErrors, "MissingRequiredFieldError").
    79  									ValuesFunc(func(group *jen.Group) {
    80  										group.Add(jen.Id("Name").Op(":").Lit(fieldName))
    81  									}),
    82  							))
    83  						}
    84  					}
    85  					switch headerName.Optional.ToOptionalType() {
    86  					case OptionalTypeRequired:
    87  						group.Add(
    88  							jen.If(cond).
    89  								BlockFunc(setHeaderFunc(headerName.HeaderName, fieldName)).
    90  								Else().
    91  								BlockFunc(appendMissingRequiredFieldErrorFunc(fieldName)),
    92  						)
    93  					case OptionalTypeOmitEmpty, OptionalTypeNullable:
    94  						group.Add(
    95  							jen.If(cond).
    96  								BlockFunc(setHeaderFunc(headerName.HeaderName, fieldName)),
    97  						)
    98  					case OptionalTypeKeepEmpty:
    99  						setHeaderFunc(headerName.HeaderName, fieldName)(group)
   100  					}
   101  				}
   102  				group.Add(jen.Return(jen.Id("allHeaders"), jen.Nil()))
   103  			}),
   104  	)
   105  	return nil
   106  }