// Copyright 2024 Matthew Rich . 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 }