mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 10:03:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2017 Google LLC. All Rights Reserved.
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
//    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
// Package jsonschema supports the reading, writing, and manipulation
 | 
						|
// of JSON Schemas.
 | 
						|
package jsonschema
 | 
						|
 | 
						|
import "gopkg.in/yaml.v3"
 | 
						|
 | 
						|
// The Schema struct models a JSON Schema and, because schemas are
 | 
						|
// defined hierarchically, contains many references to itself.
 | 
						|
// All fields are pointers and are nil if the associated values
 | 
						|
// are not specified.
 | 
						|
type Schema struct {
 | 
						|
	Schema *string // $schema
 | 
						|
	ID     *string // id keyword used for $ref resolution scope
 | 
						|
	Ref    *string // $ref, i.e. JSON Pointers
 | 
						|
 | 
						|
	// http://json-schema.org/latest/json-schema-validation.html
 | 
						|
	// 5.1.  Validation keywords for numeric instances (number and integer)
 | 
						|
	MultipleOf       *SchemaNumber
 | 
						|
	Maximum          *SchemaNumber
 | 
						|
	ExclusiveMaximum *bool
 | 
						|
	Minimum          *SchemaNumber
 | 
						|
	ExclusiveMinimum *bool
 | 
						|
 | 
						|
	// 5.2.  Validation keywords for strings
 | 
						|
	MaxLength *int64
 | 
						|
	MinLength *int64
 | 
						|
	Pattern   *string
 | 
						|
 | 
						|
	// 5.3.  Validation keywords for arrays
 | 
						|
	AdditionalItems *SchemaOrBoolean
 | 
						|
	Items           *SchemaOrSchemaArray
 | 
						|
	MaxItems        *int64
 | 
						|
	MinItems        *int64
 | 
						|
	UniqueItems     *bool
 | 
						|
 | 
						|
	// 5.4.  Validation keywords for objects
 | 
						|
	MaxProperties        *int64
 | 
						|
	MinProperties        *int64
 | 
						|
	Required             *[]string
 | 
						|
	AdditionalProperties *SchemaOrBoolean
 | 
						|
	Properties           *[]*NamedSchema
 | 
						|
	PatternProperties    *[]*NamedSchema
 | 
						|
	Dependencies         *[]*NamedSchemaOrStringArray
 | 
						|
 | 
						|
	// 5.5.  Validation keywords for any instance type
 | 
						|
	Enumeration *[]SchemaEnumValue
 | 
						|
	Type        *StringOrStringArray
 | 
						|
	AllOf       *[]*Schema
 | 
						|
	AnyOf       *[]*Schema
 | 
						|
	OneOf       *[]*Schema
 | 
						|
	Not         *Schema
 | 
						|
	Definitions *[]*NamedSchema
 | 
						|
 | 
						|
	// 6.  Metadata keywords
 | 
						|
	Title       *string
 | 
						|
	Description *string
 | 
						|
	Default     *yaml.Node
 | 
						|
 | 
						|
	// 7.  Semantic validation with "format"
 | 
						|
	Format *string
 | 
						|
}
 | 
						|
 | 
						|
// These helper structs represent "combination" types that generally can
 | 
						|
// have values of one type or another. All are used to represent parts
 | 
						|
// of Schemas.
 | 
						|
 | 
						|
// SchemaNumber represents a value that can be either an Integer or a Float.
 | 
						|
type SchemaNumber struct {
 | 
						|
	Integer *int64
 | 
						|
	Float   *float64
 | 
						|
}
 | 
						|
 | 
						|
// NewSchemaNumberWithInteger creates and returns a new object
 | 
						|
func NewSchemaNumberWithInteger(i int64) *SchemaNumber {
 | 
						|
	result := &SchemaNumber{}
 | 
						|
	result.Integer = &i
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// NewSchemaNumberWithFloat creates and returns a new object
 | 
						|
func NewSchemaNumberWithFloat(f float64) *SchemaNumber {
 | 
						|
	result := &SchemaNumber{}
 | 
						|
	result.Float = &f
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// SchemaOrBoolean represents a value that can be either a Schema or a Boolean.
 | 
						|
type SchemaOrBoolean struct {
 | 
						|
	Schema  *Schema
 | 
						|
	Boolean *bool
 | 
						|
}
 | 
						|
 | 
						|
// NewSchemaOrBooleanWithSchema creates and returns a new object
 | 
						|
func NewSchemaOrBooleanWithSchema(s *Schema) *SchemaOrBoolean {
 | 
						|
	result := &SchemaOrBoolean{}
 | 
						|
	result.Schema = s
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// NewSchemaOrBooleanWithBoolean creates and returns a new object
 | 
						|
func NewSchemaOrBooleanWithBoolean(b bool) *SchemaOrBoolean {
 | 
						|
	result := &SchemaOrBoolean{}
 | 
						|
	result.Boolean = &b
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// StringOrStringArray represents a value that can be either
 | 
						|
// a String or an Array of Strings.
 | 
						|
type StringOrStringArray struct {
 | 
						|
	String      *string
 | 
						|
	StringArray *[]string
 | 
						|
}
 | 
						|
 | 
						|
// NewStringOrStringArrayWithString creates and returns a new object
 | 
						|
func NewStringOrStringArrayWithString(s string) *StringOrStringArray {
 | 
						|
	result := &StringOrStringArray{}
 | 
						|
	result.String = &s
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// NewStringOrStringArrayWithStringArray creates and returns a new object
 | 
						|
func NewStringOrStringArrayWithStringArray(a []string) *StringOrStringArray {
 | 
						|
	result := &StringOrStringArray{}
 | 
						|
	result.StringArray = &a
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// SchemaOrStringArray represents a value that can be either
 | 
						|
// a Schema or an Array of Strings.
 | 
						|
type SchemaOrStringArray struct {
 | 
						|
	Schema      *Schema
 | 
						|
	StringArray *[]string
 | 
						|
}
 | 
						|
 | 
						|
// SchemaOrSchemaArray represents a value that can be either
 | 
						|
// a Schema or an Array of Schemas.
 | 
						|
type SchemaOrSchemaArray struct {
 | 
						|
	Schema      *Schema
 | 
						|
	SchemaArray *[]*Schema
 | 
						|
}
 | 
						|
 | 
						|
// NewSchemaOrSchemaArrayWithSchema creates and returns a new object
 | 
						|
func NewSchemaOrSchemaArrayWithSchema(s *Schema) *SchemaOrSchemaArray {
 | 
						|
	result := &SchemaOrSchemaArray{}
 | 
						|
	result.Schema = s
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// NewSchemaOrSchemaArrayWithSchemaArray creates and returns a new object
 | 
						|
func NewSchemaOrSchemaArrayWithSchemaArray(a []*Schema) *SchemaOrSchemaArray {
 | 
						|
	result := &SchemaOrSchemaArray{}
 | 
						|
	result.SchemaArray = &a
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// SchemaEnumValue represents a value that can be part of an
 | 
						|
// enumeration in a Schema.
 | 
						|
type SchemaEnumValue struct {
 | 
						|
	String *string
 | 
						|
	Bool   *bool
 | 
						|
}
 | 
						|
 | 
						|
// NamedSchema is a name-value pair that is used to emulate maps
 | 
						|
// with ordered keys.
 | 
						|
type NamedSchema struct {
 | 
						|
	Name  string
 | 
						|
	Value *Schema
 | 
						|
}
 | 
						|
 | 
						|
// NewNamedSchema creates and returns a new object
 | 
						|
func NewNamedSchema(name string, value *Schema) *NamedSchema {
 | 
						|
	return &NamedSchema{Name: name, Value: value}
 | 
						|
}
 | 
						|
 | 
						|
// NamedSchemaOrStringArray is a name-value pair that is used
 | 
						|
// to emulate maps with ordered keys.
 | 
						|
type NamedSchemaOrStringArray struct {
 | 
						|
	Name  string
 | 
						|
	Value *SchemaOrStringArray
 | 
						|
}
 | 
						|
 | 
						|
// Access named subschemas by name
 | 
						|
 | 
						|
func namedSchemaArrayElementWithName(array *[]*NamedSchema, name string) *Schema {
 | 
						|
	if array == nil {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	for _, pair := range *array {
 | 
						|
		if pair.Name == name {
 | 
						|
			return pair.Value
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// PropertyWithName returns the selected element.
 | 
						|
func (s *Schema) PropertyWithName(name string) *Schema {
 | 
						|
	return namedSchemaArrayElementWithName(s.Properties, name)
 | 
						|
}
 | 
						|
 | 
						|
// PatternPropertyWithName returns the selected element.
 | 
						|
func (s *Schema) PatternPropertyWithName(name string) *Schema {
 | 
						|
	return namedSchemaArrayElementWithName(s.PatternProperties, name)
 | 
						|
}
 | 
						|
 | 
						|
// DefinitionWithName returns the selected element.
 | 
						|
func (s *Schema) DefinitionWithName(name string) *Schema {
 | 
						|
	return namedSchemaArrayElementWithName(s.Definitions, name)
 | 
						|
}
 | 
						|
 | 
						|
// AddProperty adds a named property.
 | 
						|
func (s *Schema) AddProperty(name string, property *Schema) {
 | 
						|
	*s.Properties = append(*s.Properties, NewNamedSchema(name, property))
 | 
						|
}
 |