Enums in Schema are now interface{} types in datamodel #1

Addressing issues #1, Enums can be anything and should not be consideded plain strings.
This commit is contained in:
Dave Shanley
2022-10-27 06:51:37 -04:00
parent 626fe42ded
commit 54d924d46d
4 changed files with 269 additions and 248 deletions

View File

@@ -4,6 +4,7 @@
package base package base
import ( import (
"fmt"
"github.com/pb33f/libopenapi/datamodel/high" "github.com/pb33f/libopenapi/datamodel/high"
lowmodel "github.com/pb33f/libopenapi/datamodel/low" lowmodel "github.com/pb33f/libopenapi/datamodel/low"
"github.com/pb33f/libopenapi/datamodel/low/base" "github.com/pb33f/libopenapi/datamodel/low/base"
@@ -69,7 +70,7 @@ type Schema struct {
MaxProperties *int64 MaxProperties *int64
MinProperties *int64 MinProperties *int64
Required []string Required []string
Enum []string Enum []any
AdditionalProperties any AdditionalProperties any
Description string Description string
Default any Default any
@@ -171,9 +172,9 @@ func NewSchema(schema *base.Schema) *Schema {
} }
s.Required = req s.Required = req
var enum []string var enum []any
for i := range schema.Enum.Value { for i := range schema.Enum.Value {
enum = append(enum, schema.Enum.Value[i].Value) enum = append(enum, fmt.Sprint(schema.Enum.Value[i].Value))
} }
s.Enum = enum s.Enum = enum

View File

@@ -86,7 +86,7 @@ type Schema struct {
MaxProperties low.NodeReference[int64] MaxProperties low.NodeReference[int64]
MinProperties low.NodeReference[int64] MinProperties low.NodeReference[int64]
Required low.NodeReference[[]low.ValueReference[string]] Required low.NodeReference[[]low.ValueReference[string]]
Enum low.NodeReference[[]low.ValueReference[string]] Enum low.NodeReference[[]low.ValueReference[any]]
Not low.NodeReference[[]low.ValueReference[*SchemaProxy]] Not low.NodeReference[[]low.ValueReference[*SchemaProxy]]
Items low.NodeReference[[]low.ValueReference[*SchemaProxy]] Items low.NodeReference[[]low.ValueReference[*SchemaProxy]]
Properties low.NodeReference[map[low.KeyReference[string]]low.ValueReference[*SchemaProxy]] Properties low.NodeReference[map[low.KeyReference[string]]low.ValueReference[*SchemaProxy]]
@@ -143,7 +143,7 @@ func (s *Schema) Hash() [32]byte {
d = append(d, s.Required.Value[i].Value) d = append(d, s.Required.Value[i].Value)
} }
for i := range s.Enum.Value { for i := range s.Enum.Value {
d = append(d, s.Enum.Value[i].Value) d = append(d, fmt.Sprint(s.Enum.Value[i].Value))
} }
propertyKeys := make([]string, 0, len(s.Properties.Value)) propertyKeys := make([]string, 0, len(s.Properties.Value))
for i := range s.Properties.Value { for i := range s.Properties.Value {

View File

@@ -424,6 +424,26 @@ func SetField(field reflect.Value, valueNode *yaml.Node, keyNode *yaml.Node) err
} }
} }
} }
case reflect.TypeOf(NodeReference[[]ValueReference[any]]{}):
if valueNode != nil {
if utils.IsNodeArray(valueNode) {
if field.CanSet() {
var items []ValueReference[any]
for _, sliceItem := range valueNode.Content {
items = append(items, ValueReference[any]{
Value: sliceItem.Value,
ValueNode: sliceItem,
})
}
n := NodeReference[[]ValueReference[any]]{
Value: items,
KeyNode: keyNode,
ValueNode: valueNode,
}
field.Set(reflect.ValueOf(n))
}
}
}
default: default:
// we want to ignore everything else, each model handles its own complex types. // we want to ignore everything else, each model handles its own complex types.
break break

View File

@@ -683,10 +683,10 @@ func checkSchemaPropertyChanges(
j = make(map[string]int) j = make(map[string]int)
k = make(map[string]int) k = make(map[string]int)
for i := range lSchema.Enum.Value { for i := range lSchema.Enum.Value {
j[lSchema.Enum.Value[i].Value] = i j[fmt.Sprint(lSchema.Enum.Value[i].Value)] = i
} }
for i := range rSchema.Enum.Value { for i := range rSchema.Enum.Value {
k[rSchema.Enum.Value[i].Value] = i k[fmt.Sprint(rSchema.Enum.Value[i].Value)] = i
} }
for g := range k { for g := range k {
if _, ok := j[g]; !ok { if _, ok := j[g]; !ok {