2017-04-17 18:08:24 -04:00
|
|
|
// Copyright 2013 MongoDB, Inc.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
// author tolsen
|
|
|
|
// author-github https://github.com/tolsen
|
|
|
|
//
|
|
|
|
// repository-name gojsonschema
|
|
|
|
// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language.
|
|
|
|
//
|
|
|
|
// description Implements a persistent (immutable w/ shared structure) singly-linked list of strings for the purpose of storing a json context
|
|
|
|
//
|
|
|
|
// created 04-09-2013
|
|
|
|
|
|
|
|
package gojsonschema
|
|
|
|
|
|
|
|
import "bytes"
|
|
|
|
|
2019-04-12 20:56:09 -04:00
|
|
|
// JsonContext implements a persistent linked-list of strings
|
|
|
|
type JsonContext struct {
|
2017-04-17 18:08:24 -04:00
|
|
|
head string
|
2019-04-12 20:56:09 -04:00
|
|
|
tail *JsonContext
|
2017-04-17 18:08:24 -04:00
|
|
|
}
|
|
|
|
|
2019-04-12 20:56:09 -04:00
|
|
|
func NewJsonContext(head string, tail *JsonContext) *JsonContext {
|
|
|
|
return &JsonContext{head, tail}
|
2017-04-17 18:08:24 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// String displays the context in reverse.
|
|
|
|
// This plays well with the data structure's persistent nature with
|
|
|
|
// Cons and a json document's tree structure.
|
2019-04-12 20:56:09 -04:00
|
|
|
func (c *JsonContext) String(del ...string) string {
|
2017-04-17 18:08:24 -04:00
|
|
|
byteArr := make([]byte, 0, c.stringLen())
|
|
|
|
buf := bytes.NewBuffer(byteArr)
|
|
|
|
c.writeStringToBuffer(buf, del)
|
|
|
|
|
|
|
|
return buf.String()
|
|
|
|
}
|
|
|
|
|
2019-04-12 20:56:09 -04:00
|
|
|
func (c *JsonContext) stringLen() int {
|
2017-04-17 18:08:24 -04:00
|
|
|
length := 0
|
|
|
|
if c.tail != nil {
|
|
|
|
length = c.tail.stringLen() + 1 // add 1 for "."
|
|
|
|
}
|
|
|
|
|
|
|
|
length += len(c.head)
|
|
|
|
return length
|
|
|
|
}
|
|
|
|
|
2019-04-12 20:56:09 -04:00
|
|
|
func (c *JsonContext) writeStringToBuffer(buf *bytes.Buffer, del []string) {
|
2017-04-17 18:08:24 -04:00
|
|
|
if c.tail != nil {
|
|
|
|
c.tail.writeStringToBuffer(buf, del)
|
|
|
|
|
|
|
|
if len(del) > 0 {
|
|
|
|
buf.WriteString(del[0])
|
|
|
|
} else {
|
|
|
|
buf.WriteString(".")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
buf.WriteString(c.head)
|
|
|
|
}
|