Files
libopenapi/datamodel/low/base/discriminator.go
Dave Shanley 4b9c5fba1e Building out schema comparison mechanism
Which has led to a new wider hashing capability for the low level API. hashing makes it very easy to determine changes quickly, without having to run comparisons to discover changes, could really speed things up moving forward.
2022-10-08 14:09:46 -04:00

53 lines
1.7 KiB
Go

// Copyright 2022 Princess B33f Heavy Industries / Dave Shanley
// SPDX-License-Identifier: MIT
package base
import (
"crypto/sha256"
"github.com/pb33f/libopenapi/datamodel/low"
"sort"
"strings"
)
// Discriminator is only used by OpenAPI 3+ documents, it represents a polymorphic discriminator used for schemas
//
// When request bodies or response payloads may be one of a number of different schemas, a discriminator object can be
// used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema
// which is used to inform the consumer of the document of an alternative schema based on the value associated with it.
//
// When using the discriminator, inline schemas will not be considered.
// v3 - https://spec.openapis.org/oas/v3.1.0#discriminator-object
type Discriminator struct {
PropertyName low.NodeReference[string]
Mapping map[low.KeyReference[string]]low.ValueReference[string]
}
// FindMappingValue will return a ValueReference containing the string mapping value
func (d *Discriminator) FindMappingValue(key string) *low.ValueReference[string] {
for k, v := range d.Mapping {
if k.Value == key {
return &v
}
}
return nil
}
// Hash will return a consistent SHA256 Hash of the Discriminator object
func (d *Discriminator) Hash() [32]byte {
// calculate a hash from every property.
f := []string{d.PropertyName.Value}
propertyKeys := make([]string, 0, len(d.Mapping))
for i := range d.Mapping {
propertyKeys = append(propertyKeys, i.Value)
}
sort.Strings(propertyKeys)
for k := range propertyKeys {
prop := d.FindMappingValue(propertyKeys[k])
f = append(f, prop.Value)
}
return sha256.Sum256([]byte(strings.Join(f, "|")))
}