Merge pull request #1690 from willhite/path

Make path immutable
This commit is contained in:
Dan Willhite
2016-06-01 12:08:02 -07:00
2 changed files with 18 additions and 2 deletions

View File

@@ -24,11 +24,15 @@ func NewPath() Path {
}
func (p Path) AddField(name string) Path {
return append(p, newFieldPart(name))
p1 := make(Path, len(p), len(p)+1)
copy(p1, p)
return append(p1, newFieldPart(name))
}
func (p Path) AddIndex(idx Value) Path {
return append(p, newIndexPart(idx))
p1 := make(Path, len(p), len(p)+1)
copy(p1, p)
return append(p1, newIndexPart(idx))
}
func (p Path) Resolve(v Value) (resolved Value) {

View File

@@ -103,3 +103,15 @@ func TestPathToString(t *testing.T) {
assert.Equal("[\"0\"][\"1\"][\"100\"]", NewPath().AddIndex(NewString("0")).AddIndex(NewString("1")).AddIndex(NewString("100")).String())
assert.Equal(".foo[0].bar[4.5][false]", NewPath().AddField("foo").AddIndex(Number(0)).AddField("bar").AddIndex(Number(4.5)).AddIndex(Bool(false)).String())
}
func TestPathImmutability(t *testing.T) {
assert := assert.New(t)
p1 := NewPath().AddField("/").AddField("value").AddField("data").AddIndex(Number(1)).AddField("data")
p2 := p1.AddField("x")
p3 := p1.AddField("y")
p4 := p3.AddIndex(Number(19))
assert.Equal("./.value.data[1].data", p1.String())
assert.Equal("./.value.data[1].data.x", p2.String())
assert.Equal("./.value.data[1].data.y", p3.String())
assert.Equal("./.value.data[1].data.y[19]", p4.String())
}