func executeResponseDSL(name string, paramsAndDSL ...interface{}) *design.ResponseDefinition { var params []string var dsl func() var ok bool if len(paramsAndDSL) > 0 { d := paramsAndDSL[len(paramsAndDSL)-1] if dsl, ok = d.(func()); ok { paramsAndDSL = paramsAndDSL[:len(paramsAndDSL)-1] } params = make([]string, len(paramsAndDSL)) for i, p := range paramsAndDSL { params[i], ok = p.(string) if !ok { dslengine.ReportError("invalid response template parameter %#v, must be a string", p) return nil } } } var resp *design.ResponseDefinition if len(params) > 0 { if tmpl, ok := design.Design.ResponseTemplates[name]; ok { resp = tmpl.Template(params...) } else if tmpl, ok := design.Design.DefaultResponseTemplates[name]; ok { resp = tmpl.Template(params...) } else { dslengine.ReportError("no response template named %#v", name) return nil } } else { if ar, ok := design.Design.Responses[name]; ok { resp = ar.Dup() resp.Global = true } else if ar, ok := design.Design.DefaultResponses[name]; ok { resp = ar.Dup() resp.Standard = true } else { resp = &design.ResponseDefinition{Name: name} } } if dsl != nil { if !dslengine.Execute(dsl, resp) { return nil } resp.Standard = false resp.Global = false } return resp }