57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package schema
|
|
|
|
import (
|
|
"context"
|
|
|
|
"forge.cadoles.com/cadoles/bouncer/internal/store"
|
|
"github.com/pkg/errors"
|
|
"github.com/qri-io/jsonschema"
|
|
)
|
|
|
|
var defaultRegistry = NewRegistry()
|
|
|
|
func RegisterLayerOptionsSchema(layerType store.LayerType, schema *jsonschema.Schema) {
|
|
defaultRegistry.RegisterLayerOptionsSchema(layerType, schema)
|
|
}
|
|
|
|
func ValidateLayerOptions(ctx context.Context, layerType store.LayerType, options *store.LayerOptions) error {
|
|
if err := defaultRegistry.ValidateLayerOptions(ctx, layerType, options); err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type Registry struct {
|
|
layerOptionSchemas map[store.LayerType]*jsonschema.Schema
|
|
}
|
|
|
|
func (r *Registry) RegisterLayerOptionsSchema(layerType store.LayerType, schema *jsonschema.Schema) {
|
|
r.layerOptionSchemas[layerType] = schema
|
|
}
|
|
|
|
func (r *Registry) ValidateLayerOptions(ctx context.Context, layerType store.LayerType, options *store.LayerOptions) error {
|
|
schema, exists := r.layerOptionSchemas[layerType]
|
|
if !exists {
|
|
return errors.WithStack(ErrSchemaNotFound)
|
|
}
|
|
|
|
rawOptions := func(opts *store.LayerOptions) map[string]any {
|
|
return *opts
|
|
}(options)
|
|
|
|
state := schema.Validate(ctx, rawOptions)
|
|
|
|
if len(*state.Errs) > 0 {
|
|
return errors.WithStack(NewInvalidDataError(*state.Errs...))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func NewRegistry() *Registry {
|
|
return &Registry{
|
|
layerOptionSchemas: make(map[store.LayerType]*jsonschema.Schema),
|
|
}
|
|
}
|