1
0
mirror of https://github.com/rancher/steve.git synced 2025-04-27 02:51:10 +00:00
steve/pkg/schema/converter/openapiv3.go
Darren Shepherd 8b42d0aff8 Refactor
2020-01-30 22:37:59 -07:00

81 lines
1.9 KiB
Go

package converter
import (
"github.com/rancher/steve/pkg/schemaserver/types"
"github.com/rancher/wrangler/pkg/schemas"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
)
func modelV3ToSchema(name string, k *v1beta1.JSONSchemaProps, schemasMap map[string]*types.APISchema) *types.APISchema {
s := types.APISchema{
Schema: &schemas.Schema{
ID: name,
ResourceFields: map[string]schemas.Field{},
Attributes: map[string]interface{}{},
Description: k.Description,
},
}
for fieldName, schemaField := range k.Properties {
s.ResourceFields[fieldName] = toResourceField(name+"."+fieldName, schemaField, schemasMap)
}
for _, fieldName := range k.Required {
if f, ok := s.ResourceFields[fieldName]; ok {
f.Required = true
s.ResourceFields[fieldName] = f
}
}
if _, ok := schemasMap[s.ID]; !ok {
schemasMap[s.ID] = &s
}
return &s
}
func toResourceField(name string, schema v1beta1.JSONSchemaProps, schemasMap map[string]*types.APISchema) schemas.Field {
f := schemas.Field{
Description: schema.Description,
Nullable: true,
Create: true,
Update: true,
}
var itemSchema *v1beta1.JSONSchemaProps
if schema.Items != nil {
if schema.Items.Schema != nil {
itemSchema = schema.Items.Schema
} else if len(schema.Items.JSONSchemas) > 0 {
itemSchema = &schema.Items.JSONSchemas[0]
}
}
switch schema.Type {
case "array":
if itemSchema == nil {
f.Type = "array[json]"
} else {
f.Type = "array[" + name + "]"
modelV3ToSchema(name, itemSchema, schemasMap)
}
case "object":
if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil {
f.Type = "map[" + name + "]"
modelV3ToSchema(name, schema.AdditionalProperties.Schema, schemasMap)
} else {
f.Type = name
modelV3ToSchema(name, &schema, schemasMap)
}
case "number":
f.Type = "int"
default:
f.Type = schema.Type
}
if f.Type == "" {
f.Type = "json"
}
return f
}