func (g *Generator) generateActionClient(action *design.ActionDefinition, file *codegen.SourceFile, funcs template.FuncMap) error { var ( params []string names []string queryParams []*paramData headers []*paramData signer string clientsTmpl = template.Must(template.New("clients").Funcs(funcs).Parse(clientsTmpl)) requestsTmpl = template.Must(template.New("requests").Funcs(funcs).Parse(requestsTmpl)) clientsWSTmpl = template.Must(template.New("clientsws").Funcs(funcs).Parse(clientsWSTmpl)) ) if action.Payload != nil { params = append(params, "payload "+codegen.GoTypeRef(action.Payload, action.Payload.AllRequired(), 1, false)) names = append(names, "payload") } initParams := func(att *design.AttributeDefinition) []*paramData { if att == nil { return nil } obj := att.Type.ToObject() var pdata []*paramData var optData []*paramData for n, q := range obj { varName := codegen.Goify(n, false) param := ¶mData{ Name: n, VarName: varName, Attribute: q, } if q.Type.IsPrimitive() { param.MustToString = q.Type.Kind() != design.StringKind if att.IsRequired(n) { param.ValueName = varName pdata = append(pdata, param) } else { param.ValueName = "*" + varName param.CheckNil = true optData = append(optData, param) } } else { if q.Type.IsArray() { param.IsArray = true param.ElemAttribute = q.Type.ToArray().ElemType } param.MustToString = true param.ValueName = varName param.CheckNil = true if att.IsRequired(n) { pdata = append(pdata, param) } else { optData = append(optData, param) } } } sort.Sort(byParamName(pdata)) sort.Sort(byParamName(optData)) // Update closure for _, p := range pdata { names = append(names, p.VarName) params = append(params, p.VarName+" "+cmdFieldType(p.Attribute.Type, false)) } for _, p := range optData { names = append(names, p.VarName) params = append(params, p.VarName+" "+cmdFieldType(p.Attribute.Type, p.Attribute.Type.IsPrimitive())) } return append(pdata, optData...) } queryParams = initParams(action.QueryParams) headers = initParams(action.Headers) if action.Security != nil { signer = codegen.Goify(action.Security.Scheme.SchemeName, true) } data := struct { Name string ResourceName string Description string Routes []*design.RouteDefinition HasPayload bool Params string ParamNames string CanonicalScheme string Signer string QueryParams []*paramData Headers []*paramData }{ Name: action.Name, ResourceName: action.Parent.Name, Description: action.Description, Routes: action.Routes, HasPayload: action.Payload != nil, Params: strings.Join(params, ", "), ParamNames: strings.Join(names, ", "), CanonicalScheme: action.CanonicalScheme(), Signer: signer, QueryParams: queryParams, Headers: headers, } if action.WebSocket() { return clientsWSTmpl.Execute(file, data) } if err := clientsTmpl.Execute(file, data); err != nil { return err } return requestsTmpl.Execute(file, data) }