59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
|
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
|
||
|
|
||
|
package schema
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"github.com/xeipuuv/gojsonschema"
|
||
|
"strings"
|
||
|
"embed"
|
||
|
"net/http"
|
||
|
"log/slog"
|
||
|
"io/fs"
|
||
|
)
|
||
|
|
||
|
//go:embed schemas/*.schema.json
|
||
|
var schemaFiles embed.FS
|
||
|
|
||
|
type Schema struct {
|
||
|
schema gojsonschema.JSONLoader
|
||
|
}
|
||
|
|
||
|
func New(name string, fs fs.FS) *Schema {
|
||
|
path := fmt.Sprintf("file://schemas/%s.schema.json", name)
|
||
|
|
||
|
return &Schema{schema: gojsonschema.NewReferenceLoaderFileSystem(path, http.FS(fs))}
|
||
|
//return &Schema{schema: gojsonschema.NewReferenceLoader(path)}
|
||
|
}
|
||
|
|
||
|
func (s *Schema) Validate(source string) error {
|
||
|
// loader := gojsonschema.NewGoLoader(source)
|
||
|
loader := gojsonschema.NewStringLoader(source)
|
||
|
result, err := gojsonschema.Validate(s.schema, loader)
|
||
|
|
||
|
if err != nil {
|
||
|
slog.Info("schema error", "source", source, "schema", s.schema, "result", result, "err", err)
|
||
|
return err
|
||
|
}
|
||
|
slog.Info("schema.Validate()", "schema", s.schema, "result", result, "err", err)
|
||
|
|
||
|
if !result.Valid() {
|
||
|
schemaErrors := strings.Builder{}
|
||
|
for _, err := range result.Errors() {
|
||
|
schemaErrors.WriteString(err.String() + "\n")
|
||
|
}
|
||
|
schemaErrors.WriteString(source)
|
||
|
return errors.New(schemaErrors.String())
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *Schema) ValidateSchema() error {
|
||
|
sl := gojsonschema.NewSchemaLoader()
|
||
|
sl.Validate = true
|
||
|
schemaErr := sl.AddSchemas(s.schema)
|
||
|
slog.Info("validate schema definition", "schemaloader", sl, "err", schemaErr)
|
||
|
return schemaErr
|
||
|
}
|