// GoTypeDef returns the Go code that defines a Go type which matches the data structure // definition (the part that comes after `type foo`). // tabs is the number of tab character(s) used to tabulate the definition however the first // line is never indented. // jsonTags controls whether to produce json tags. // private controls whether the field is a pointer or not. All fields in the struct are // pointers for a private struct. func GoTypeDef(ds design.DataStructure, tabs int, jsonTags, private bool) string { def := ds.Definition() t := def.Type switch actual := t.(type) { case design.Primitive: return GoTypeName(t, nil, tabs, private) case *design.Array: d := GoTypeDef(actual.ElemType, tabs, jsonTags, private) if actual.ElemType.Type.IsObject() { d = "*" + d } return "[]" + d case *design.Hash: keyDef := GoTypeDef(actual.KeyType, tabs, jsonTags, private) if actual.KeyType.Type.IsObject() { keyDef = "*" + keyDef } elemDef := GoTypeDef(actual.ElemType, tabs, jsonTags, private) if actual.ElemType.Type.IsObject() { elemDef = "*" + elemDef } return fmt.Sprintf("map[%s]%s", keyDef, elemDef) case design.Object: return goTypeDefObject(actual, def, tabs, jsonTags, private) case *design.UserTypeDefinition: return GoTypeName(actual, actual.AllRequired(), tabs, private) case *design.MediaTypeDefinition: return GoTypeName(actual, actual.AllRequired(), tabs, private) default: panic("goa bug: unknown data structure type") } }
// GoTypeDef returns the Go code that defines a Go type which matches the data structure // definition (the part that comes after `type foo`). // versioned indicates whether the type is being referenced from a version package (true) or the // default package (false). // tabs is the number of tab character(s) used to tabulate the definition however the first // line is never indented. // jsonTags controls whether to produce json tags. func GoTypeDef(ds design.DataStructure, versioned bool, defPkg string, tabs int, jsonTags bool) string { var buffer bytes.Buffer def := ds.Definition() t := def.Type switch actual := t.(type) { case design.Primitive: return GoTypeName(t, nil, tabs) case *design.Array: d := GoTypeDef(actual.ElemType, versioned, defPkg, tabs, jsonTags) if actual.ElemType.Type.IsObject() { d = "*" + d } return "[]" + d case *design.Hash: keyDef := GoTypeDef(actual.KeyType, versioned, defPkg, tabs, jsonTags) if actual.KeyType.Type.IsObject() { keyDef = "*" + keyDef } elemDef := GoTypeDef(actual.ElemType, versioned, defPkg, tabs, jsonTags) if actual.ElemType.Type.IsObject() { elemDef = "*" + elemDef } return fmt.Sprintf("map[%s]%s", keyDef, elemDef) case design.Object: buffer.WriteString("struct {\n") keys := make([]string, len(actual)) i := 0 for n := range actual { keys[i] = n i++ } sort.Strings(keys) for _, name := range keys { WriteTabs(&buffer, tabs+1) field := actual[name] typedef := GoTypeDef(field, versioned, defPkg, tabs+1, jsonTags) if field.Type.IsObject() || def.IsPrimitivePointer(name) { typedef = "*" + typedef } fname := Goify(name, true) var tags string if jsonTags { var omit string if !def.IsRequired(name) { omit = ",omitempty" } tags = fmt.Sprintf(" `json:\"%s%s\" xml:\"%s%s\"`", name, omit, name, omit) } desc := actual[name].Description if desc != "" { desc = fmt.Sprintf("// %s\n", desc) } buffer.WriteString(fmt.Sprintf("%s%s %s%s\n", desc, fname, typedef, tags)) } WriteTabs(&buffer, tabs) buffer.WriteString("}") return buffer.String() case *design.UserTypeDefinition: return GoPackageTypeName(actual, actual.AllRequired(), versioned, defPkg, tabs) case *design.MediaTypeDefinition: return GoPackageTypeName(actual, actual.AllRequired(), versioned, defPkg, tabs) default: panic("goa bug: unknown data structure type") } }