402 lines
16 KiB
Cheetah
402 lines
16 KiB
Cheetah
{{define "Type"}}
|
|
{{- $typeName := index . 0 -}}
|
|
{{- $disablePointer := index . 1 -}}
|
|
|
|
{{- if eq $typeName "string" -}}
|
|
{{- if not $disablePointer -}}*{{- end -}}string
|
|
{{- else if eq $typeName "boolean" -}}
|
|
{{- if not $disablePointer -}}*{{- end -}}bool
|
|
{{- else if eq $typeName "integer" -}}
|
|
{{- if not $disablePointer -}}*{{- end -}}int
|
|
{{- else if eq $typeName "long" -}}
|
|
{{- if not $disablePointer -}}*{{- end -}}int64
|
|
{{- else if eq $typeName "timestamp" -}}
|
|
{{- if not $disablePointer -}}*{{- end -}}time.Time
|
|
{{- else if eq $typeName "binary" -}}
|
|
io.Reader
|
|
{{- else if eq $typeName "array" -}}
|
|
interface{}
|
|
{{- else if eq $typeName "object" -}}
|
|
interface{}
|
|
{{- else if eq $typeName "map" -}}
|
|
interface{}
|
|
{{- else if eq $typeName "any" -}}
|
|
interface{}
|
|
{{- else -}}
|
|
*{{$typeName | camelCase}}Type
|
|
{{- end -}}
|
|
{{end}}
|
|
|
|
{{define "PropertyType"}}
|
|
{{- $property := index . 0 -}}
|
|
{{- $disablePointer := index . 1 -}}
|
|
|
|
{{- if eq $property.Type "object" -}}
|
|
{{template "Type" passThrough $property.ExtraType $disablePointer}}
|
|
{{- else if eq $property.Type "array" -}}
|
|
[]{{template "Type" passThrough $property.ExtraType $disablePointer}}
|
|
{{- else if eq $property.Type "map" -}}
|
|
map[string]{{template "Type" passThrough $property.ExtraType $disablePointer}}
|
|
{{- else if eq $property.Type "any" -}}
|
|
{{template "Type" passThrough $property.Type $disablePointer}}
|
|
{{- else -}}
|
|
{{template "Type" passThrough $property.Type $disablePointer}}
|
|
{{- end -}}
|
|
{{end}}
|
|
|
|
{{define "PropertyTags"}}
|
|
{{- $property := . -}}
|
|
{{- if $property.IsRequired -}}
|
|
{{- printf `json:"%s"` ($property.Name | normalized) -}}
|
|
{{- else -}}
|
|
{{- printf `json:"%s,omitempty"` ($property.Name | normalized) -}}
|
|
{{- end -}}
|
|
{{- printf ` name:"%s"` ($property.Name | normalized) -}}
|
|
{{- if $property.Format}}
|
|
{{- printf ` format:"%s"` $property.Format -}}
|
|
{{- end -}}
|
|
{{- if $property.Default -}}
|
|
{{- printf ` default:"%s"` $property.Default -}}
|
|
{{- end -}}
|
|
{{end}}
|
|
|
|
{{define "PropertyTagsDashConnected"}}
|
|
{{- $property := . -}}
|
|
{{- printf `json:"%s"` ($property.Name | dashConnected) -}}
|
|
{{- printf ` name:"%s"` ($property.Name | dashConnected) -}}
|
|
{{end}}
|
|
|
|
{{define "PropertyExtraTags"}}
|
|
{{- $propertyExtraTags := . -}}
|
|
{{- if $propertyExtraTags -}}
|
|
{{- printf " %s" $propertyExtraTags -}}
|
|
{{- end -}}
|
|
{{end}}
|
|
|
|
{{define "RenderProperties"}}
|
|
{{- $customizedType := index . 0 -}}
|
|
{{- $propertyExtraTags := index . 1 -}}
|
|
{{- $operationName := index . 2 -}}
|
|
|
|
{{range $_, $property := $customizedType.Properties -}}
|
|
{{if or (ne $operationName "Delete Multiple Objects") (ne $property.ID "Content-MD5") -}}
|
|
{{if $property.Description -}}
|
|
// {{$property.Description}}
|
|
{{end -}}
|
|
{{if $property.Enum -}}
|
|
// {{$property.ID | camelCase}}'s available values: {{$property.Enum | commaConnected}}
|
|
{{end -}}
|
|
{{$property.ID | camelCase | upperFirst}}{{" " -}}
|
|
{{template "PropertyType" passThrough $property false}}{{" " -}}
|
|
`{{template "PropertyTags" $property}}{{template "PropertyExtraTags" $propertyExtraTags}}`{{" " -}}
|
|
{{if $property.IsRequired -}}
|
|
// Required
|
|
{{- end}}
|
|
{{- end}}
|
|
{{end}}
|
|
{{end}}
|
|
|
|
{{define "RenderOperation"}}
|
|
{{$service := index . 0}}
|
|
{{$operation := index . 1}}
|
|
|
|
{{$belongs := replace $service.Name "QingStor" "Service" -1}}
|
|
{{$belongs := replace $belongs "Object" "Bucket" -1}}
|
|
{{$opID := $operation.ID | camelCase}}
|
|
|
|
{{$isBucket := eq $service.Name "Bucket"}}
|
|
{{$isObject := eq $service.Name "Object"}}
|
|
|
|
{{$hasQuery := gt (len $operation.Request.Query.Properties) 0}}
|
|
{{$hasHeaders := gt (len $operation.Request.Headers.Properties) 0}}
|
|
{{$hasElements := gt (len $operation.Request.Elements.Properties) 0}}
|
|
{{$hasStringBody := eq $operation.Request.Body.Type "string"}}
|
|
{{$hasBinaryBody := eq $operation.Request.Body.Type "binary"}}
|
|
{{$hasInput := or $hasQuery $hasHeaders $hasElements $hasStringBody $hasBinaryBody}}
|
|
|
|
{{if $operation.Description -}}
|
|
{{if eq $belongs "Bucket" -}}
|
|
// {{replace $opID "Bucket" "" -1}} does {{$operation.Description}}
|
|
{{else -}}
|
|
// {{$opID}} does {{$operation.Description}}
|
|
{{end -}}
|
|
{{end -}}
|
|
{{if $operation.DocumentationURL -}}
|
|
// Documentation URL: {{$operation.DocumentationURL}}
|
|
{{- end}}
|
|
{{if eq $belongs "Bucket" -}}
|
|
func (s *{{$belongs}}) {{replace $opID "Bucket" "" -1 -}}(
|
|
{{- if $isObject}}objectKey string,{{end -}}
|
|
{{- if $hasInput}}input *{{$opID}}Input{{end -}}
|
|
) (*{{$opID}}Output, error) {
|
|
{{else -}}
|
|
func (s *{{$belongs}}) {{$opID}}(
|
|
{{- if $hasInput}}input *{{$opID}}Input{{end -}}
|
|
) (*{{$opID}}Output, error) {
|
|
{{end -}}
|
|
{{if eq $belongs "Bucket" -}}
|
|
r, x, err := s.{{replace $opID "Bucket" "" -1}}Request(
|
|
{{- if $isObject}}objectKey,{{end -}}
|
|
{{- if $hasInput}}input{{end -}}
|
|
)
|
|
{{else -}}
|
|
r, x, err := s.{{$opID}}Request(
|
|
{{- if $hasInput}}input{{end -}}
|
|
)
|
|
{{end}}
|
|
if err != nil {
|
|
return x, err
|
|
}
|
|
|
|
err = r.Send()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
|
|
x.RequestID = &requestID
|
|
|
|
return x, err
|
|
}
|
|
|
|
{{if $operation.Description -}}
|
|
{{if eq $belongs "Bucket" -}}
|
|
// {{replace $opID "Bucket" "" -1}}Request creates request and output object of {{$opID}}.
|
|
{{else -}}
|
|
// {{$opID}}Request creates request and output object of {{$opID}}.
|
|
{{end -}}
|
|
{{end -}}
|
|
{{if eq $belongs "Bucket" -}}
|
|
func (s *{{$belongs}}) {{replace $opID "Bucket" "" -1 -}}Request(
|
|
{{- if $isObject}}objectKey string,{{end -}}
|
|
{{- if $hasInput}}input *{{$opID}}Input{{end -}}
|
|
) (*request.Request, *{{$opID}}Output, error) {
|
|
{{else -}}
|
|
func (s *{{$belongs}}) {{$opID}}Request(
|
|
{{- if $hasInput}}input *{{$opID}}Input{{end -}}
|
|
) (*request.Request, *{{$opID}}Output, error) {
|
|
{{end -}}
|
|
{{if $hasInput}}
|
|
if input == nil {
|
|
input = &{{$opID}}Input{}
|
|
}
|
|
{{end}}
|
|
{{$path := $operation.Request.Path}}
|
|
{{$path := replace $path "{" "<" -1}}
|
|
{{$path := replace $path "}" ">" -1}}
|
|
{{$path := dashConnected $path}}
|
|
|
|
{{- if ne $belongs "Service"}}
|
|
properties := *s.Properties
|
|
{{- end}}
|
|
{{if eq $service.Name "Object"}}
|
|
properties.ObjectKey = &objectKey
|
|
{{end}}
|
|
|
|
o := &data.Operation{
|
|
Config: s.Config,
|
|
{{- if ne $belongs "Service"}}
|
|
Properties: &properties,
|
|
{{- end}}
|
|
APIName: "{{$operation.Name}}",
|
|
RequestMethod: "{{$operation.Request.Method}}",
|
|
RequestURI: "{{$path}}",
|
|
StatusCodes: []int{
|
|
{{range $keyStatus, $valueStatus := $operation.Responses -}}
|
|
{{- if $valueStatus.StatusCode -}}
|
|
{{$valueStatus.StatusCode.Code}}, // {{$valueStatus.StatusCode.Description}}
|
|
{{else}}
|
|
200, // OK
|
|
{{end -}}
|
|
{{else}}
|
|
200, // OK
|
|
{{end -}}
|
|
},
|
|
}
|
|
|
|
x := &{{$opID}}Output{}
|
|
r, err := request.New(o, {{if $hasInput}}input{{else}}nil{{end}}, x)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
return r, x, nil
|
|
}
|
|
|
|
{{if $hasInput}}
|
|
// {{$opID}}Input presents input for {{$opID}}.
|
|
type {{$opID}}Input struct {
|
|
{{- if $operation.Request.Query.Properties | len}}
|
|
{{$data := $operation.Request.Query -}}
|
|
{{template "RenderProperties" passThrough $data `location:"query"` $operation.Name}}
|
|
{{end}}
|
|
|
|
{{- if $operation.Request.Headers.Properties | len}}
|
|
{{$data := $operation.Request.Headers -}}
|
|
{{template "RenderProperties" passThrough $data `location:"headers"` $operation.Name}}
|
|
{{end}}
|
|
|
|
{{- if $operation.Request.Elements.Properties | len}}
|
|
{{$data := $operation.Request.Elements -}}
|
|
{{template "RenderProperties" passThrough $data `location:"elements"` $operation.Name}}
|
|
{{end}}
|
|
|
|
{{- if eq $operation.Request.Body.Type "string"}}
|
|
{{if $operation.Request.Body.Description -}}
|
|
// {{$operation.Request.Body.Description}}
|
|
{{- end}}
|
|
Body string `location:"body"`
|
|
{{else if eq $operation.Request.Body.Type "binary"}}
|
|
{{if $operation.Request.Body.Description -}}
|
|
// {{$operation.Request.Body.Description}}
|
|
{{- end}}
|
|
Body io.Reader `location:"body"`
|
|
{{end}}
|
|
}
|
|
|
|
// Validate validates the input for {{$opID}}.
|
|
func (v *{{$opID}}Input) Validate() error {
|
|
{{template "ValidateCustomizedType" passThrough $operation.Request.Query $operation.Name}}
|
|
{{template "ValidateCustomizedType" passThrough $operation.Request.Headers $operation.Name}}
|
|
{{template "ValidateCustomizedType" passThrough $operation.Request.Elements $operation.Name}}
|
|
|
|
return nil
|
|
}
|
|
{{end}}
|
|
|
|
// {{$opID}}Output presents output for {{$opID}}.
|
|
type {{$opID}}Output struct {
|
|
StatusCode *int `location:"statusCode"`
|
|
|
|
RequestID *string `location:"requestID"`
|
|
{{range $keyStatus, $valueStatus := $operation.Responses -}}
|
|
{{if eq $valueStatus.Body.Type "string"}}
|
|
{{if $valueStatus.Body.Description -}}
|
|
// {{$valueStatus.Body.Description}}
|
|
{{- end}}
|
|
Body string `location:"body"`
|
|
{{else if eq $valueStatus.Body.Type "binary"}}
|
|
{{if $valueStatus.Body.Description -}}
|
|
// {{$valueStatus.Body.Description}}
|
|
{{- end}}
|
|
Body io.ReadCloser `location:"body"`
|
|
{{end}}
|
|
|
|
{{if $valueStatus.Elements.Properties | len}}
|
|
{{$data := $valueStatus.Elements}}
|
|
{{template "RenderProperties" passThrough $data `location:"elements"` $operation.Name}}
|
|
{{end}}
|
|
|
|
{{if $valueStatus.Headers.Properties | len}}
|
|
{{$data := $valueStatus.Headers}}
|
|
{{template "RenderProperties" passThrough $data `location:"headers"` $operation.Name}}
|
|
{{end}}
|
|
{{end}}
|
|
}
|
|
{{range $keyStatus, $valueStatus := $operation.Responses -}}
|
|
{{if eq $valueStatus.Body.Type "binary"}}
|
|
// Close will close the underlay body.
|
|
func (o *{{$opID}}Output) Close() (err error) {
|
|
if o.Body != nil {
|
|
return o.Body.Close()
|
|
}
|
|
return
|
|
}
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
|
|
{{define "SubServiceInitParams"}}
|
|
{{- $customizedType := index . 0 -}}
|
|
{{- $disablePointer := index . 1 -}}
|
|
|
|
{{- range $_, $property := $customizedType.Properties -}}
|
|
{{$property.ID | camelCase | lowerFirstWord}}{{" " -}}
|
|
{{template "PropertyType" passThrough $property $disablePointer}},
|
|
{{- end -}}
|
|
{{end}}
|
|
|
|
{{define "ValidateCustomizedType"}}
|
|
{{$customizedType := index . 0}}
|
|
{{$operationName := index . 1}}
|
|
|
|
{{range $_, $property := $customizedType.Properties}}
|
|
{{if or (ne $operationName "Delete Multiple Objects") (ne $property.ID "Content-MD5") -}}
|
|
{{$isNormalType := or (eq $property.Type "string") (eq $property.Type "integer")}}
|
|
{{$isContentLength := eq $property.ID "Content-Length"}}
|
|
{{if and $isNormalType (not $isContentLength) }}
|
|
{{if $property.IsRequired }}
|
|
if v.{{$property.ID | camelCase}} == nil {
|
|
return errors.ParameterRequiredError{
|
|
ParameterName: "{{$property.ID | camelCase}}",
|
|
ParentName: "{{$customizedType.ID | camelCase}}",
|
|
}
|
|
}
|
|
{{end}}
|
|
{{$parameterName := $property.ID | camelCase | lowerFirstWord}}
|
|
{{if gt ($property.Enum | len) 0}}
|
|
if v.{{$property.ID | camelCase}} != nil {
|
|
{{$parameterName}}ValidValues := []string{
|
|
{{- $property.Enum | commaConnectedWithQuote -}}
|
|
}
|
|
{{$parameterName}}ParameterValue := fmt.Sprint(*v.{{$property.ID | camelCase}})
|
|
|
|
{{$parameterName}}IsValid := false
|
|
for _, value := range {{$parameterName}}ValidValues {
|
|
if value == {{$parameterName}}ParameterValue {
|
|
{{$parameterName}}IsValid = true
|
|
}
|
|
}
|
|
|
|
if !{{$parameterName}}IsValid {
|
|
return errors.ParameterValueNotAllowedError{
|
|
ParameterName: "{{$property.ID | camelCase}}",
|
|
ParameterValue: {{$parameterName}}ParameterValue,
|
|
AllowedValues: {{$parameterName}}ValidValues,
|
|
}
|
|
}
|
|
}
|
|
{{end}}
|
|
{{end}}
|
|
|
|
{{if eq $property.Type "object"}}
|
|
if v.{{$property.ID | camelCase}} != nil {
|
|
if err := v.{{$property.ID | camelCase}}.Validate(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
{{if $property.IsRequired }}
|
|
if v.{{$property.ID | camelCase}} == nil {
|
|
return errors.ParameterRequiredError{
|
|
ParameterName: "{{$property.ID | camelCase}}",
|
|
ParentName: "{{$customizedType.ID | camelCase}}",
|
|
}
|
|
}
|
|
{{end}}
|
|
{{end}}
|
|
|
|
{{if eq $property.Type "array"}}
|
|
{{if $property.IsRequired}}
|
|
if len(v.{{$property.ID | camelCase}}) == 0 {
|
|
return errors.ParameterRequiredError{
|
|
ParameterName: "{{$property.ID | camelCase}}",
|
|
ParentName: "{{$customizedType.ID | camelCase}}",
|
|
}
|
|
}
|
|
{{end}}
|
|
{{$isNotString := ne $property.ExtraType "string"}}
|
|
{{$isNotInteger := ne $property.ExtraType "integer"}}
|
|
{{$isNotTimestamp := ne $property.ExtraType "timestamp"}}
|
|
{{if and $isNotString $isNotInteger $isNotTimestamp}}
|
|
if len(v.{{$property.ID | camelCase}}) > 0 {
|
|
for _, property := range v.{{$property.ID | camelCase}} {
|
|
if err := property.Validate(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|