add schema pkg
Some checks are pending
Lint / golangci-lint (push) Waiting to run
Declarative Tests / test (push) Waiting to run
Declarative Tests / build-fedora (push) Waiting to run
Declarative Tests / build-ubuntu-focal (push) Waiting to run

This commit is contained in:
Matthew Rich 2024-09-19 08:14:47 +00:00
parent 8094d1c063
commit 20a4e1a89d
5 changed files with 147 additions and 2 deletions

View File

@ -59,7 +59,9 @@ type ProtoDecoder struct {
func (p *ProtoDecoder) Decode(v any) (err error) { func (p *ProtoDecoder) Decode(v any) (err error) {
var protoData []byte var protoData []byte
protoData, err = io.ReadAll(p.reader) protoData, err = io.ReadAll(p.reader)
if err == nil {
err = proto.Unmarshal(protoData, v.(proto.Message)) err = proto.Unmarshal(protoData, v.(proto.Message))
}
return return
} }

View File

@ -82,7 +82,7 @@ state: present
encoder := NewEncoder(v.writer, v.format) encoder := NewEncoder(v.writer, v.format)
assert.NotNil(t, encoder) assert.NotNil(t, encoder)
assert.Nil(t, encoder.Encode(v.testuser)) assert.Nil(t, encoder.Encode(v.testuser))
assert.Equal(t, string(v.expected), string(v.writer.(*bytes.Buffer).Bytes())) assert.Equal(t, string(v.expected), v.writer.(*bytes.Buffer).String())
assert.Equal(t, v.expected, v.writer.(*bytes.Buffer).Bytes()) assert.Equal(t, v.expected, v.writer.(*bytes.Buffer).Bytes())
assert.Nil(t, encoder.Close()) assert.Nil(t, encoder.Close())
} }

58
internal/schema/schema.go Normal file
View File

@ -0,0 +1,58 @@
// 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
}

View File

@ -0,0 +1,66 @@
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package schema
import (
"encoding/json"
_ "fmt"
"github.com/stretchr/testify/assert"
_ "gopkg.in/yaml.v3"
_ "io"
_ "log"
_ "net/http"
_ "net/http/httptest"
_ "net/url"
_ "path/filepath"
_ "strings"
"testing"
"time"
)
type TestData struct {
Name string `json:"name"`
Len int `json:"len"`
Date time.Time `json:"date"`
}
func TestNewSchema(t *testing.T) {
s := New("testdata", schemaFiles)
assert.NotNil(t, s)
}
func TestSchemaValidateJSON(t *testing.T) {
s := New("testdata", schemaFiles)
assert.NotNil(t, s)
// file, _ := filepath.Abs(filepath.Join(TempDir, "fooread.txt"))
expectedAtime, atimeErr := time.Parse(time.RFC3339Nano, "2001-12-15T01:01:01.000000001Z")
assert.Nil(t, atimeErr)
// expectedTime := expectedAtime.Local().Format(time.RFC3339Nano)
/*
declarationAttributes := `
name: "%s"
date: %s
len: 15
`
decl := fmt.Sprintf(declarationAttributes, file, expectedTime)
*/
testData := &TestData{ Name: "foo", Len: 20, Date: expectedAtime }
jsonDoc, jsonErr := json.Marshal(testData)
assert.Nil(t, jsonErr)
schemaErr := s.Validate(string(jsonDoc))
assert.Nil(t, schemaErr)
}
func TestSchemaValidateSchema(t *testing.T) {
s := New("testdata", schemaFiles)
assert.NotNil(t, s)
assert.Nil(t, s.ValidateSchema())
}

View File

@ -0,0 +1,19 @@
{
"$id": "testdata.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "testdata",
"type": "object",
"required": [ "name" ],
"properties": {
"name": {
"type": "string",
"description": "test name"
},
"len": {
"type": "integer",
"description": "test number",
"minimum": 5
}
}
}