in generate/generate.go [1503:1700]
func (s *service) generateHelperFuncs(a *API) {
p, pn := s.p, s.pn
if strings.HasPrefix(a.Name, "list") {
v, found := hasNameOrKeywordParamField(a.Name, a.Params)
if found && hasIDAndNameResponseField(a.Name, a.Response) {
ln := strings.TrimPrefix(a.Name, "list")
// Check if ID is a required parameters and bail if so
for _, ap := range a.Params {
if ap.Required && ap.Name == "id" {
return
}
}
// Generate the function signature
pn("// This is a courtesy helper function, which in some cases may not work as expected!")
p("func (s *%s) Get%sID(%s string, ", s.name, parseSingular(ln), v)
for _, ap := range a.Params {
if ap.Required || isRequiredParam(a, ap) {
p("%s %s, ", s.parseParamName(ap.Name), mapType(a.Name, ap.Name, ap.Type))
}
}
if parseSingular(ln) == "Iso" {
p("isofilter string, ")
}
if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
p("zoneid string, ")
}
pn("opts ...OptionFunc) (string, int, error) {")
// Generate the function body
pn(" p := &List%sParams{}", ln)
pn(" p.p = make(map[string]interface{})")
pn("")
pn(" p.p[\"%s\"] = %s", v, v)
for _, ap := range a.Params {
if ap.Required || isRequiredParam(a, ap) {
pn(" p.p[\"%s\"] = %s", ap.Name, s.parseParamName(ap.Name))
}
}
if parseSingular(ln) == "Iso" {
pn(" p.p[\"isofilter\"] = isofilter")
}
if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
pn(" p.p[\"zoneid\"] = zoneid")
}
pn("")
pn(" for _, fn := range append(s.cs.options, opts...) {")
pn(" if err := fn(s.cs, p); err != nil {")
pn(" return \"\", -1, err")
pn(" }")
pn(" }")
pn("")
pn(" l, err := s.List%s(p)", ln)
pn(" if err != nil {")
pn(" return \"\", -1, err")
pn(" }")
pn("")
if ln == "AffinityGroups" {
pn(" // This is needed because of a bug with the listAffinityGroup call. It reports the")
pn(" // number of VirtualMachines in the groups as being the number of groups found.")
pn(" l.Count = len(l.%s)", ln)
pn("")
}
pn(" if l.Count == 0 {")
pn(" return \"\", l.Count, fmt.Errorf(\"No match found for %%s: %%+v\", %s, l)", v)
pn(" }")
pn("")
pn(" if l.Count == 1 {")
pn(" return l.%s[0].Id, l.Count, nil", ln)
pn(" }")
pn("")
pn(" if l.Count > 1 {")
pn(" for _, v := range l.%s {", ln)
pn(" if v.Name == %s {", v)
pn(" return v.Id, l.Count, nil")
pn(" }")
pn(" }")
pn(" }")
pn(" return \"\", l.Count, fmt.Errorf(\"Could not find an exact match for %%s: %%+v\", %s, l)", v)
pn("}\n")
pn("")
if hasIDParamField(a.Name, a.Params) {
// Generate the function signature
pn("// This is a courtesy helper function, which in some cases may not work as expected!")
p("func (s *%s) Get%sByName(name string, ", s.name, parseSingular(ln))
for _, ap := range a.Params {
if ap.Required || isRequiredParam(a, ap) {
p("%s %s, ", s.parseParamName(ap.Name), mapType(a.Name, ap.Name, ap.Type))
}
}
if parseSingular(ln) == "Iso" {
p("isofilter string, ")
}
if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
p("zoneid string, ")
}
pn("opts ...OptionFunc) (*%s, int, error) {", parseSingular(ln))
// Generate the function body
p(" id, count, err := s.Get%sID(name, ", parseSingular(ln))
for _, ap := range a.Params {
if ap.Required || isRequiredParam(a, ap) {
p("%s, ", s.parseParamName(ap.Name))
}
}
if parseSingular(ln) == "Iso" {
p("isofilter, ")
}
if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
p("zoneid, ")
}
pn("opts...)")
pn(" if err != nil {")
pn(" return nil, count, err")
pn(" }")
pn("")
p(" r, count, err := s.Get%sByID(id, ", parseSingular(ln))
for _, ap := range a.Params {
if ap.Required || isRequiredParam(a, ap) {
p("%s, ", s.parseParamName(ap.Name))
}
}
pn("opts...)")
pn(" if err != nil {")
pn(" return nil, count, err")
pn(" }")
pn(" return r, count, nil")
pn("}")
pn("")
}
}
if hasIDParamField(a.Name, a.Params) {
ln := strings.TrimPrefix(a.Name, "list")
// Generate the function signature
pn("// This is a courtesy helper function, which in some cases may not work as expected!")
p("func (s *%s) Get%sByID(id string, ", s.name, parseSingular(ln))
for _, ap := range a.Params {
if ap.Required && s.parseParamName(ap.Name) != "id" {
p("%s %s, ", ap.Name, mapType(a.Name, ap.Name, ap.Type))
}
}
if ln == "LoadBalancerRuleInstances" {
pn("opts ...OptionFunc) (*VirtualMachine, int, error) {")
} else {
pn("opts ...OptionFunc) (*%s, int, error) {", parseSingular(ln))
}
// Generate the function body
pn(" p := &List%sParams{}", ln)
pn(" p.p = make(map[string]interface{})")
pn("")
pn(" p.p[\"id\"] = id")
for _, ap := range a.Params {
if ap.Required && s.parseParamName(ap.Name) != "id" {
pn(" p.p[\"%s\"] = %s", ap.Name, s.parseParamName(ap.Name))
}
}
pn("")
pn(" for _, fn := range append(s.cs.options, opts...) {")
pn(" if err := fn(s.cs, p); err != nil {")
pn(" return nil, -1, err")
pn(" }")
pn(" }")
pn("")
pn(" l, err := s.List%s(p)", ln)
pn(" if err != nil {")
pn(" if strings.Contains(err.Error(), fmt.Sprintf(")
pn(" \"Invalid parameter id value=%%s due to incorrect long value format, \"+")
pn(" \"or entity does not exist\", id)) {")
pn(" return nil, 0, fmt.Errorf(\"No match found for %%s: %%+v\", id, l)")
pn(" }")
pn(" return nil, -1, err")
pn(" }")
pn("")
if ln == "AffinityGroups" {
pn(" // This is needed because of a bug with the listAffinityGroup call. It reports the")
pn(" // number of VirtualMachines in the groups as being the number of groups found.")
pn(" l.Count = len(l.%s)", ln)
pn("")
}
pn(" if l.Count == 0 {")
pn(" return nil, l.Count, fmt.Errorf(\"No match found for %%s: %%+v\", id, l)")
pn(" }")
pn("")
pn(" if l.Count == 1 {")
pn(" return l.%s[0], l.Count, nil", ln)
pn(" }")
pn(" return nil, l.Count, fmt.Errorf(\"There is more then one result for %s UUID: %%s!\", id)", parseSingular(ln))
pn("}\n")
pn("")
}
}
}