Add a JSON reader loader
diff --git a/jsonLoader.go b/jsonLoader.go
index 1edc702..080e493 100644
--- a/jsonLoader.go
+++ b/jsonLoader.go
@@ -293,6 +293,31 @@
}
+type jsonIOLoader struct {
+ buf *bytes.Buffer
+}
+
+func NewReaderLoader(source io.Reader) (*jsonIOLoader, io.Reader) {
+ buf := &bytes.Buffer{}
+ return &jsonIOLoader{buf: buf}, io.TeeReader(source, buf)
+}
+
+func (l *jsonIOLoader) JsonSource() interface{} {
+ return l.buf.String()
+}
+
+func (l *jsonIOLoader) LoadJSON() (interface{}, error) {
+ return decodeJsonUsingNumber(l.buf)
+}
+
+func (l *jsonIOLoader) JsonReference() (gojsonreference.JsonReference, error) {
+ return gojsonreference.NewJsonReference("#")
+}
+
+func (l *jsonIOLoader) LoaderFactory() JSONLoaderFactory {
+ return &DefaultJSONLoaderFactory{}
+}
+
func decodeJsonUsingNumber(r io.Reader) (interface{}, error) {
var document interface{}
diff --git a/schema_test.go b/schema_test.go
index a7b9d34..7503d2f 100644
--- a/schema_test.go
+++ b/schema_test.go
@@ -26,7 +26,9 @@
package gojsonschema
import (
+ "bytes"
"fmt"
+ "io/ioutil"
"net/http"
"os"
"reflect"
@@ -491,8 +493,18 @@
}`
func TestLoaders(t *testing.T) {
+ // setup reader loader
+ reader := bytes.NewBufferString(simpleSchema)
+ readerLoader, wrappedReader := NewReaderLoader(reader)
+
+ // drain reader
+ by, err := ioutil.ReadAll(wrappedReader)
+ assert.Nil(t, err)
+ assert.Equal(t, simpleSchema, string(by))
+
loaders := []JSONLoader{
NewStringLoader(simpleSchema),
+ readerLoader,
}
for _, l := range loaders {
@@ -513,8 +525,18 @@
}`
func TestLoadersWithInvalidPattern(t *testing.T) {
+ // setup reader loader
+ reader := bytes.NewBufferString(invalidPattern)
+ readerLoader, wrappedReader := NewReaderLoader(reader)
+
+ // drain reader
+ by, err := ioutil.ReadAll(wrappedReader)
+ assert.Nil(t, err)
+ assert.Equal(t, invalidPattern, string(by))
+
loaders := []JSONLoader{
NewStringLoader(invalidPattern),
+ readerLoader,
}
for _, l := range loaders {