// Trait defines an API trait. A trait encapsulates arbitrary DSL that gets executed wherever the // trait is called via the UseTrait function. func Trait(name string, val ...func()) { var ver *design.APIVersionDefinition if a, ok := apiDefinition(false); ok { ver = a.APIVersionDefinition } else if v, ok := versionDefinition(true); ok { ver = v } if len(val) < 1 { ReportError("missing trait DSL for %s", name) return } else if len(val) > 1 { ReportError("too many arguments given to Trait") return } if ver == nil { return } if _, ok := ver.Traits[name]; ok { ReportError("multiple definitions for trait %s%s", name, ver.Context()) return } trait := &design.TraitDefinition{Name: name, DSLFunc: val[0]} if ver.Traits == nil { ver.Traits = make(map[string]*design.TraitDefinition) } ver.Traits[name] = trait }