// goTypeDefObject returns the Go code that defines a Go struct. func goTypeDefObject(obj design.Object, def *design.AttributeDefinition, tabs int, jsonTags, private bool) string { var buffer bytes.Buffer buffer.WriteString("struct {\n") keys := make([]string, len(obj)) i := 0 for n := range obj { keys[i] = n i++ } sort.Strings(keys) for _, name := range keys { WriteTabs(&buffer, tabs+1) field := obj[name] typedef := GoTypeDef(field, tabs+1, jsonTags, private) if (field.Type.IsPrimitive() && private) || field.Type.IsObject() || def.IsPrimitivePointer(name) { typedef = "*" + typedef } fname := GoifyAtt(field, name, true) var tags string if jsonTags { tags = attributeTags(def, field, name, private) } desc := obj[name].Description if desc != "" { desc = strings.Replace(desc, "\n", "\n\t// ", -1) desc = fmt.Sprintf("// %s\n\t", desc) } buffer.WriteString(fmt.Sprintf("%s%s %s%s\n", desc, fname, typedef, tags)) } WriteTabs(&buffer, tabs) buffer.WriteString("}") return buffer.String() }
// RecursivePublicizer produces code that copies fields from the private struct to the // public struct func RecursivePublicizer(att *design.AttributeDefinition, source, target string, depth int) string { var publications []string if o := att.Type.ToObject(); o != nil { if mt, ok := att.Type.(*design.MediaTypeDefinition); ok { // Hmm media types should never get here att = mt.AttributeDefinition } else if ut, ok := att.Type.(*design.UserTypeDefinition); ok { att = ut.AttributeDefinition } o.IterateAttributes(func(n string, catt *design.AttributeDefinition) error { publication := Publicizer( catt, fmt.Sprintf("%s.%s", source, Goify(n, true)), fmt.Sprintf("%s.%s", target, Goify(n, true)), catt.Type.IsPrimitive() && !att.IsPrimitivePointer(n), depth+1, false, ) publication = fmt.Sprintf("%sif %s.%s != nil {\n%s\n%s}", Tabs(depth), source, Goify(n, true), publication, Tabs(depth)) publications = append(publications, publication) return nil }) } return strings.Join(publications, "\n") }
func attToObject(name string, parent, att *design.AttributeDefinition) *ObjectType { obj := &ObjectType{} obj.Label = name obj.Name = codegen.Goify(name, false) obj.Type = codegen.GoTypeRef(att.Type, nil, 0, false) if att.Type.IsPrimitive() && parent.IsPrimitivePointer(name) { obj.Pointer = "*" } return obj }
// goTypeDefObject returns the Go code that defines a Go struct. func goTypeDefObject(actual design.Object, def *design.AttributeDefinition, tabs int, jsonTags, private bool) string { var buffer bytes.Buffer 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, tabs+1, jsonTags, private) if (field.Type.IsPrimitive() && private) || field.Type.IsObject() || def.IsPrimitivePointer(name) { typedef = "*" + typedef } fname := name if field.Metadata != nil { if tname, ok := field.Metadata["struct:field:name"]; ok { if len(tname) > 0 { fname = tname[0] } } } fname = Goify(fname, true) var tags string if jsonTags { tags = attributeTags(def, field, name, private) } desc := actual[name].Description if desc != "" { desc = fmt.Sprintf("// %s\n\t", desc) } buffer.WriteString(fmt.Sprintf("%s%s %s%s\n", desc, fname, typedef, tags)) } WriteTabs(&buffer, tabs) buffer.WriteString("}") return buffer.String() }
// RecursivePublicizer produces code that copies fields from the private struct to the // public struct func RecursivePublicizer(att *design.AttributeDefinition, source, target string, depth int) string { var publications []string if o := att.Type.ToObject(); o != nil { if ds, ok := att.Type.(design.DataStructure); ok { att = ds.Definition() } o.IterateAttributes(func(n string, catt *design.AttributeDefinition) error { publication := Publicizer( catt, fmt.Sprintf("%s.%s", source, Goify(n, true)), fmt.Sprintf("%s.%s", target, Goify(n, true)), catt.Type.IsPrimitive() && !att.IsPrimitivePointer(n), depth+1, false, ) publication = fmt.Sprintf("%sif %s.%s != nil {\n%s\n%s}", Tabs(depth), source, Goify(n, true), publication, Tabs(depth)) publications = append(publications, publication) return nil }) } return strings.Join(publications, "\n") }