func()

in pkg/generators/openapi.go [617:675]


func (g openAPITypeWriter) generateProperty(m *types.Member, parent *types.Type) error {
	name := getReferableName(m)
	if name == "" {
		return nil
	}
	if err := g.validatePatchTags(m, parent); err != nil {
		return err
	}
	g.Do("\"$.$\": {\n", name)
	if err := g.generateMemberExtensions(m, parent); err != nil {
		return err
	}
	g.Do("SchemaProps: spec.SchemaProps{\n", nil)
	var extraComments []string
	if enumType, isEnum := g.enumContext.EnumType(m.Type); isEnum {
		extraComments = enumType.DescriptionLines()
	}
	g.generateDescription(append(m.CommentLines, extraComments...))
	jsonTags := getJsonTags(m)
	if len(jsonTags) > 1 && jsonTags[1] == "string" {
		g.generateSimpleProperty("string", "")
		g.Do("},\n},\n", nil)
		return nil
	}
	omitEmpty := strings.Contains(reflect.StructTag(m.Tags).Get("json"), "omitempty")
	if err := g.generateDefault(m.CommentLines, m.Type, omitEmpty); err != nil {
		return fmt.Errorf("failed to generate default in %v: %v: %v", parent, m.Name, err)
	}
	t := resolveAliasAndPtrType(m.Type)
	// If we can get a openAPI type and format for this type, we consider it to be simple property
	typeString, format := openapi.OpenAPITypeFormat(t.String())
	if typeString != "" {
		g.generateSimpleProperty(typeString, format)
		if enumType, isEnum := g.enumContext.EnumType(m.Type); isEnum {
			// original type is an enum, add "Enum: " and the values
			g.Do("Enum: []interface{}{$.$}", strings.Join(enumType.ValueStrings(), ", "))
		}
		g.Do("},\n},\n", nil)
		return nil
	}
	switch t.Kind {
	case types.Builtin:
		return fmt.Errorf("please add type %v to getOpenAPITypeFormat function", t)
	case types.Map:
		if err := g.generateMapProperty(t); err != nil {
			return fmt.Errorf("failed to generate map property in %v: %v: %v", parent, m.Name, err)
		}
	case types.Slice, types.Array:
		if err := g.generateSliceProperty(t); err != nil {
			return fmt.Errorf("failed to generate slice property in %v: %v: %v", parent, m.Name, err)
		}
	case types.Struct, types.Interface:
		g.generateReferenceProperty(t)
	default:
		return fmt.Errorf("cannot generate spec for type %v", t)
	}
	g.Do("},\n},\n", nil)
	return g.Error()
}