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 }