mirror of
https://github.com/yannh/kubeconform.git
synced 2026-02-18 01:17:03 +00:00
106 lines
2.8 KiB
Go
106 lines
2.8 KiB
Go
package jsonschema
|
|
|
|
// CompilerContext provides helpers for
|
|
// compiling a [Vocabulary].
|
|
type CompilerContext struct {
|
|
c *objCompiler
|
|
}
|
|
|
|
func (ctx *CompilerContext) Enqueue(schPath []string) *Schema {
|
|
ptr := ctx.c.up.ptr
|
|
for _, tok := range schPath {
|
|
ptr = ptr.append(tok)
|
|
}
|
|
return ctx.c.enqueuePtr(ptr)
|
|
}
|
|
|
|
// Vocabulary defines a set of keywords, their syntax and
|
|
// their semantics.
|
|
type Vocabulary struct {
|
|
// URL identifier for this Vocabulary.
|
|
URL string
|
|
|
|
// Schema that is used to validate the keywords that is introduced by this
|
|
// vocabulary.
|
|
Schema *Schema
|
|
|
|
// Subschemas lists the possible locations of subschemas introduced by
|
|
// this vocabulary.
|
|
Subschemas []SchemaPath
|
|
|
|
// Compile compiles the keywords(introduced by this vocabulary) in obj into [SchemaExt].
|
|
// If obj does not contain any keywords introduced by this vocabulary, nil SchemaExt must
|
|
// be returned.
|
|
Compile func(ctx *CompilerContext, obj map[string]any) (SchemaExt, error)
|
|
}
|
|
|
|
// --
|
|
|
|
// SchemaExt is compled form of vocabulary.
|
|
type SchemaExt interface {
|
|
// Validate validates v against and errors if any are reported
|
|
// to ctx.
|
|
Validate(ctx *ValidatorContext, v any)
|
|
}
|
|
|
|
// ValidatorContext provides helpers for
|
|
// validating with [SchemaExt].
|
|
type ValidatorContext struct {
|
|
vd *validator
|
|
}
|
|
|
|
// Validate validates v with sch. vpath gives path of v from current context value.
|
|
func (ctx *ValidatorContext) Validate(sch *Schema, v any, vpath []string) error {
|
|
switch len(vpath) {
|
|
case 0:
|
|
return ctx.vd.validateSelf(sch, "", false)
|
|
case 1:
|
|
return ctx.vd.validateVal(sch, v, vpath[0])
|
|
default:
|
|
return ctx.vd.validateValue(sch, v, vpath)
|
|
}
|
|
}
|
|
|
|
// EvaluatedProp marks given property of current object as evaluated.
|
|
func (ctx *ValidatorContext) EvaluatedProp(pname string) {
|
|
delete(ctx.vd.uneval.props, pname)
|
|
}
|
|
|
|
// EvaluatedItem marks items at given index of current array as evaluated.
|
|
func (ctx *ValidatorContext) EvaluatedItem(index int) {
|
|
delete(ctx.vd.uneval.items, index)
|
|
}
|
|
|
|
// AddError reports validation-error of given kind.
|
|
func (ctx *ValidatorContext) AddError(k ErrorKind) {
|
|
ctx.vd.addError(k)
|
|
}
|
|
|
|
// AddErrors reports validation-errors of given kind.
|
|
func (ctx *ValidatorContext) AddErrors(errors []*ValidationError, k ErrorKind) {
|
|
ctx.vd.addErrors(errors, k)
|
|
}
|
|
|
|
// AddErr reports the given err. This is typically used to report
|
|
// the error created by subschema validation.
|
|
//
|
|
// NOTE that err must be of type *ValidationError.
|
|
func (ctx *ValidatorContext) AddErr(err error) {
|
|
ctx.vd.addErr(err)
|
|
}
|
|
|
|
func (ctx *ValidatorContext) Equals(v1, v2 any) (bool, error) {
|
|
b, k := equals(v1, v2)
|
|
if k != nil {
|
|
return false, ctx.vd.error(k)
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func (ctx *ValidatorContext) Duplicates(arr []any) (int, int, error) {
|
|
i, j, k := duplicates(arr)
|
|
if k != nil {
|
|
return -1, -1, ctx.vd.error(k)
|
|
}
|
|
return i, j, nil
|
|
}
|