mirror of https://github.com/databricks/cli.git
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
|
package jsonschema
|
||
|
|
||
|
import (
|
||
|
"slices"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Property defines a single property of a struct schema.
|
||
|
// This type is not used in the schema itself but rather to
|
||
|
// return the pair of a property name and its schema.
|
||
|
type Property struct {
|
||
|
Name string
|
||
|
Schema *Schema
|
||
|
}
|
||
|
|
||
|
// OrderedProperties returns the properties of the schema ordered according
|
||
|
// to the value of their `order` extension. If this extension is not set, the
|
||
|
// properties are ordered alphabetically.
|
||
|
func (s *Schema) OrderedProperties() []Property {
|
||
|
order := make(map[string]*int)
|
||
|
out := make([]Property, 0, len(s.Properties))
|
||
|
for key, property := range s.Properties {
|
||
|
order[key] = property.Order
|
||
|
out = append(out, Property{
|
||
|
Name: key,
|
||
|
Schema: property,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Sort the properties by order and then by name.
|
||
|
slices.SortFunc(out, func(a, b Property) int {
|
||
|
oa := order[a.Name]
|
||
|
ob := order[b.Name]
|
||
|
cmp := 0
|
||
|
switch {
|
||
|
case oa != nil && ob != nil:
|
||
|
// Compare the order values if both are set.
|
||
|
cmp = *oa - *ob
|
||
|
case oa == nil && ob != nil:
|
||
|
// If only one is set, the one that is set comes first.
|
||
|
cmp = 1
|
||
|
case oa != nil && ob == nil:
|
||
|
// If only one is set, the one that is set comes first.
|
||
|
cmp = -1
|
||
|
}
|
||
|
|
||
|
// If we have a non-zero comparison, return it.
|
||
|
if cmp != 0 {
|
||
|
return cmp
|
||
|
}
|
||
|
|
||
|
// If the order is the same, compare by name.
|
||
|
return strings.Compare(a.Name, b.Name)
|
||
|
})
|
||
|
|
||
|
return out
|
||
|
}
|