func()

in generate/generate.go [1740:1883]


func (s *service) generateNewAPICallFunc(a *API) {
	pn := s.pn
	n := capitalize(a.Name)

	// Generate the function signature
	pn("// %s", a.Description)
	pn("func (s *%s) %s(p *%s) (*%s, error) {", s.name, n, n+"Params", strings.TrimPrefix(n, "Configure")+"Response")

	// Generate the function body
	if n == "QueryAsyncJobResult" {
		pn("	var resp json.RawMessage")
		pn("	var err error")
		pn("")
		pn("	// We should be able to retry on failure as this call is idempotent")
		pn("	for i := 0; i < 3; i++ {")
		pn("		resp, err = s.cs.newRequest(\"%s\", p.toURLValues())", a.Name)
		pn("		if err == nil {")
		pn("			break")
		pn("		}")
		pn("		time.Sleep(500 * time.Millisecond)")
		pn("	}")
	} else {
		if requiresPostMethod[a.Name] {
			pn("	resp, err := s.cs.newPostRequest(\"%s\", p.toURLValues())", a.Name)
		} else {
			pn("	resp, err := s.cs.newRequest(\"%s\", p.toURLValues())", a.Name)
		}
	}
	pn("	if err != nil {")
	pn("		return nil, err")
	pn("	}")
	pn("")
	switch n {
	case
		"AddCluster",
		"AddImageStore",
		"CreateAccount",
		"CreateDomain",
		"UpdateDomain",
		"CreateNetwork",
		"CreateStoragePool",
		"CreateNetworkOffering",
		"CreateVlanIpRange",
		"UpdateNetworkOffering",
		"UpdateServiceOffering",
		"UpdateConfiguration",
		"UpdateCluster",
		"UpdateVlanIpRange",
		"CreatePod",
		"CreateSSHKeyPair",
		"CreateSecurityGroup",
		"CreateServiceOffering",
		"CreateUser",
		"CreateZone",
		"DedicateGuestVlanRange",
		"EnableUser",
		"GetVirtualMachineUserData",
		"LockUser",
		"RegisterSSHKeyPair",
		"RegisterUserKeys",
		"GetUserKeys",
		"AddAnnotation",
		"RemoveAnnotation",
		"AddKubernetesSupportedVersion",
		"CreateDiskOffering",
		"AddHost",
		"RegisterIso":
		pn("	if resp, err = getRawValue(resp); err != nil {")
		pn("		return nil, err")
		pn("	}")
		pn("")
	}
	if !a.Isasync && s.name == "FirewallService" {
		pn("		resp, err = convertFirewallServiceResponse(resp)")
		pn("		if err != nil {")
		pn("			return nil, err")
		pn("		}")
		pn("")
	}

	if field, isNested := nestedResponse[a.Name]; isNested {
		pn("	var nested struct {")
		pn("			Response %sResponse `json:\"%s\"`", strings.TrimPrefix(n, "Configure"), field)
		pn("	}")
		pn("	if err := json.Unmarshal(resp, &nested); err != nil {")
		pn("		return nil, err")
		pn("	}")
		pn("	r := nested.Response")
	} else {
		pn("	var r %sResponse", strings.TrimPrefix(n, "Configure"))
		pn("	if err := json.Unmarshal(resp, &r); err != nil {")
		pn("		return nil, err")
		pn("	}")
	}
	pn("")
	if a.Isasync {
		pn("	// If we have a async client, we need to wait for the async result")
		pn("	if s.cs.async {")
		pn("		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)")
		pn("		if err != nil {")
		pn("			if err == AsyncTimeoutErr {")
		pn("				return &r, err")
		pn("			}")
		pn("			return nil, err")
		pn("		}")
		pn("")
		if !isSuccessOnlyResponse(a.Response) {
			pn("		b, err = getRawValue(b)")
			pn("		if err != nil {")
			pn("		  return nil, err")
			pn("		}")
			pn("")
		}
		if s.name == "FirewallService" {
			pn("		b, err = convertFirewallServiceResponse(b)")
			pn("		if err != nil {")
			pn("			return nil, err")
			pn("		}")
			pn("")
		}
		if n == "AuthorizeSecurityGroupIngress" {
			pn("		b, err = convertAuthorizeSecurityGroupIngressResponse(b)")
			pn("		if err != nil {")
			pn("			return nil, err")
			pn("		}")
			pn("")
		}
		if n == "AuthorizeSecurityGroupEgress" {
			pn("		b, err = convertAuthorizeSecurityGroupEgressResponse(b)")
			pn("		if err != nil {")
			pn("			return nil, err")
			pn("		}")
			pn("")
		}
		pn("		if err := json.Unmarshal(b, &r); err != nil {")
		pn("			return nil, err")
		pn("		}")
		pn("	}")
		pn("")
	}
	pn("	return &r, nil")
	pn("}")
	pn("")
}