diff --git a/jpath/lexer.go b/jpath/lexer.go
index 2d30bb5..0e3af11 100644
--- a/jpath/lexer.go
+++ b/jpath/lexer.go
@@ -80,11 +80,11 @@
 }
 
 func (t token) Int() int {
-  if result, err := strconv.Atoi(t.val); err != nil {
-    panic(err)
-  } else {
-    return result
-  }
+	if result, err := strconv.Atoi(t.val); err != nil {
+		panic(err)
+	} else {
+		return result
+	}
 }
 
 func (t token) String() string {
@@ -291,10 +291,10 @@
 			return lexString
 		}
 
-    if isSpace(next) {
+		if isSpace(next) {
 			l.next()
-      l.ignore()
-      continue
+			l.ignore()
+			continue
 		}
 
 		if isAlphanumeric(next) {
diff --git a/jpath/lexer_test.go b/jpath/lexer_test.go
index c553e2a..4402abb 100644
--- a/jpath/lexer_test.go
+++ b/jpath/lexer_test.go
@@ -97,4 +97,3 @@
 		token{Position{1, 12}, tokenEOF, ""},
 	})
 }
-
diff --git a/jpath/match.go b/jpath/match.go
index 345bbf4..c517157 100644
--- a/jpath/match.go
+++ b/jpath/match.go
@@ -1,35 +1,34 @@
 package jpath
 
 import (
+	"fmt"
 	. "github.com/pelletier/go-toml"
-  "fmt"
 )
 
-
 // base match
 type matchBase struct {
-  next PathFn
+	next PathFn
 }
 
 func (f *matchBase) SetNext(next PathFn) {
-  f.next = next
+	f.next = next
 }
 
 // terminating functor - gathers results
 type terminatingFn struct {
-  // empty
+	// empty
 }
 
 func newTerminatingFn() *terminatingFn {
-  return &terminatingFn{}
+	return &terminatingFn{}
 }
 
 func (f *terminatingFn) SetNext(next PathFn) {
-  // do nothing
+	// do nothing
 }
 
 func (f *terminatingFn) Call(node interface{}, ctx *queryContext) {
-  ctx.appendResult(node)
+	ctx.appendResult(node)
 }
 
 // shim to ease functor writing
@@ -39,196 +38,196 @@
 
 // match single key
 type matchKeyFn struct {
-  matchBase
-  Name string
+	matchBase
+	Name string
 }
 
 func newMatchKeyFn(name string) *matchKeyFn {
-  return &matchKeyFn{ Name: name }
+	return &matchKeyFn{Name: name}
 }
 
 func (f *matchKeyFn) Call(node interface{}, ctx *queryContext) {
-  if tree, ok := node.(*TomlTree); ok {
-    item := treeValue(tree, f.Name)
-    if item != nil {
-      f.next.Call(item, ctx)
-    }
-  }
+	if tree, ok := node.(*TomlTree); ok {
+		item := treeValue(tree, f.Name)
+		if item != nil {
+			f.next.Call(item, ctx)
+		}
+	}
 }
 
 // match single index
 type matchIndexFn struct {
-  matchBase
-  Idx int
+	matchBase
+	Idx int
 }
 
 func newMatchIndexFn(idx int) *matchIndexFn {
-  return &matchIndexFn{ Idx: idx }
+	return &matchIndexFn{Idx: idx}
 }
 
 func (f *matchIndexFn) Call(node interface{}, ctx *queryContext) {
-  if arr, ok := node.([]interface{}); ok {
-    if f.Idx < len(arr) && f.Idx >= 0 {
-      f.next.Call(arr[f.Idx], ctx)
-    }
-  }
+	if arr, ok := node.([]interface{}); ok {
+		if f.Idx < len(arr) && f.Idx >= 0 {
+			f.next.Call(arr[f.Idx], ctx)
+		}
+	}
 }
 
 // filter by slicing
 type matchSliceFn struct {
-  matchBase
-  Start, End, Step int
+	matchBase
+	Start, End, Step int
 }
 
 func newMatchSliceFn(start, end, step int) *matchSliceFn {
-  return &matchSliceFn{ Start: start, End: end, Step: step }
+	return &matchSliceFn{Start: start, End: end, Step: step}
 }
 
 func (f *matchSliceFn) Call(node interface{}, ctx *queryContext) {
-  if arr, ok := node.([]interface{}); ok {
-    // adjust indexes for negative values, reverse ordering
-    realStart, realEnd := f.Start, f.End
-    if realStart < 0 {
-      realStart = len(arr) + realStart
-    }
-    if realEnd < 0 {
-      realEnd = len(arr) + realEnd
-    }
-    if realEnd < realStart {
-      realEnd, realStart = realStart, realEnd // swap
-    }
-    // loop and gather
-    for idx := realStart; idx < realEnd; idx += f.Step {
-      f.next.Call(arr[idx], ctx)
-    }
-  }
+	if arr, ok := node.([]interface{}); ok {
+		// adjust indexes for negative values, reverse ordering
+		realStart, realEnd := f.Start, f.End
+		if realStart < 0 {
+			realStart = len(arr) + realStart
+		}
+		if realEnd < 0 {
+			realEnd = len(arr) + realEnd
+		}
+		if realEnd < realStart {
+			realEnd, realStart = realStart, realEnd // swap
+		}
+		// loop and gather
+		for idx := realStart; idx < realEnd; idx += f.Step {
+			f.next.Call(arr[idx], ctx)
+		}
+	}
 }
 
 // match anything
 type matchAnyFn struct {
-  matchBase
+	matchBase
 }
 
 func newMatchAnyFn() *matchAnyFn {
-  return &matchAnyFn{}
+	return &matchAnyFn{}
 }
 
 func (f *matchAnyFn) Call(node interface{}, ctx *queryContext) {
-  if tree, ok := node.(*TomlTree); ok {
-    for _, key := range tree.Keys() {
-      item := treeValue(tree, key)
-      f.next.Call(item, ctx)
-    }
-  }
+	if tree, ok := node.(*TomlTree); ok {
+		for _, key := range tree.Keys() {
+			item := treeValue(tree, key)
+			f.next.Call(item, ctx)
+		}
+	}
 }
 
 // filter through union
 type matchUnionFn struct {
-  Union []PathFn
+	Union []PathFn
 }
 
 func (f *matchUnionFn) SetNext(next PathFn) {
-  for _, fn := range f.Union {
-    fn.SetNext(next)
-  }
+	for _, fn := range f.Union {
+		fn.SetNext(next)
+	}
 }
 
 func (f *matchUnionFn) Call(node interface{}, ctx *queryContext) {
-  for _, fn := range f.Union {
-    fn.Call(node, ctx)
-  }
+	for _, fn := range f.Union {
+		fn.Call(node, ctx)
+	}
 }
 
 // match every single last node in the tree
 type matchRecursiveFn struct {
-  matchBase
+	matchBase
 }
 
-func newMatchRecursiveFn() *matchRecursiveFn{
-  return &matchRecursiveFn{}
+func newMatchRecursiveFn() *matchRecursiveFn {
+	return &matchRecursiveFn{}
 }
 
 func (f *matchRecursiveFn) Call(node interface{}, ctx *queryContext) {
-  if tree, ok := node.(*TomlTree); ok {
-    var visit func(tree *TomlTree)
-    visit = func(tree *TomlTree) {
-      for _, key := range tree.Keys() {
-        item := treeValue(tree, key)
-        f.next.Call(item, ctx)
-        switch node := item.(type) {
-        case *TomlTree:
-          visit(node)
-        case []*TomlTree:
-          for _, subtree := range node {
-            visit(subtree)
-          }
-        }
-      }
-    }
-    visit(tree)
-  }
+	if tree, ok := node.(*TomlTree); ok {
+		var visit func(tree *TomlTree)
+		visit = func(tree *TomlTree) {
+			for _, key := range tree.Keys() {
+				item := treeValue(tree, key)
+				f.next.Call(item, ctx)
+				switch node := item.(type) {
+				case *TomlTree:
+					visit(node)
+				case []*TomlTree:
+					for _, subtree := range node {
+						visit(subtree)
+					}
+				}
+			}
+		}
+		visit(tree)
+	}
 }
 
 // match based on an externally provided functional filter
 type matchFilterFn struct {
-  matchBase
-  Pos Position
-  Name string
+	matchBase
+	Pos  Position
+	Name string
 }
 
 func newMatchFilterFn(name string, pos Position) *matchFilterFn {
-  return &matchFilterFn{ Name: name, Pos: pos }
+	return &matchFilterFn{Name: name, Pos: pos}
 }
 
 func (f *matchFilterFn) Call(node interface{}, ctx *queryContext) {
-  fn, ok := (*ctx.filters)[f.Name]
-  if !ok {
-    panic(fmt.Sprintf("%s: query context does not have filter '%s'",
-      f.Pos, f.Name))
-  }
-  switch castNode := node.(type) {
-  case *TomlTree:
-    for _, k := range castNode.Keys() {
-      v := castNode.GetPath([]string{k})
-      if fn(v) {
-        f.next.Call(v, ctx)
-      }
-    }
-  case []interface{}:
-    for _, v := range castNode {
-      if fn(v) {
-        f.next.Call(v, ctx)
-      }
-    }
-  }
+	fn, ok := (*ctx.filters)[f.Name]
+	if !ok {
+		panic(fmt.Sprintf("%s: query context does not have filter '%s'",
+			f.Pos, f.Name))
+	}
+	switch castNode := node.(type) {
+	case *TomlTree:
+		for _, k := range castNode.Keys() {
+			v := castNode.GetPath([]string{k})
+			if fn(v) {
+				f.next.Call(v, ctx)
+			}
+		}
+	case []interface{}:
+		for _, v := range castNode {
+			if fn(v) {
+				f.next.Call(v, ctx)
+			}
+		}
+	}
 }
 
 // match based using result of an externally provided functional filter
 type matchScriptFn struct {
-  matchBase
-  Pos Position
-  Name string
+	matchBase
+	Pos  Position
+	Name string
 }
 
 func newMatchScriptFn(name string, pos Position) *matchScriptFn {
-  return &matchScriptFn{ Name: name, Pos: pos }
+	return &matchScriptFn{Name: name, Pos: pos}
 }
 
 func (f *matchScriptFn) Call(node interface{}, ctx *queryContext) {
-  fn, ok := (*ctx.scripts)[f.Name]
-  if !ok {
-    panic(fmt.Sprintf("%s: query context does not have script '%s'",
-      f.Pos, f.Name))
-  }
-  switch result := fn(node).(type) {
-  case string:
-    nextMatch := newMatchKeyFn(result)
-    nextMatch.SetNext(f.next)
-    nextMatch.Call(node, ctx)
-  case int:
-    nextMatch := newMatchIndexFn(result)
-    nextMatch.SetNext(f.next)
-    nextMatch.Call(node, ctx)
-  //TODO: support other return types?
-  }
+	fn, ok := (*ctx.scripts)[f.Name]
+	if !ok {
+		panic(fmt.Sprintf("%s: query context does not have script '%s'",
+			f.Pos, f.Name))
+	}
+	switch result := fn(node).(type) {
+	case string:
+		nextMatch := newMatchKeyFn(result)
+		nextMatch.SetNext(f.next)
+		nextMatch.Call(node, ctx)
+	case int:
+		nextMatch := newMatchIndexFn(result)
+		nextMatch.SetNext(f.next)
+		nextMatch.Call(node, ctx)
+		//TODO: support other return types?
+	}
 }
diff --git a/jpath/match_test.go b/jpath/match_test.go
index 9509ae9..d7da647 100644
--- a/jpath/match_test.go
+++ b/jpath/match_test.go
@@ -1,218 +1,218 @@
 package jpath
 
 import (
+	"fmt"
 	. "github.com/pelletier/go-toml"
-  "fmt"
-  "math"
+	"math"
 	"testing"
 )
 
 // dump path tree to a string
 func pathString(root PathFn) string {
-  result := fmt.Sprintf("%T:", root)
-  switch fn := root.(type) {
-  case *terminatingFn:
-    result += "{}"
-  case *matchKeyFn:
-    result += fmt.Sprintf("{%s}", fn.Name)
-    result += pathString(fn.next)
-  case *matchIndexFn:
-    result += fmt.Sprintf("{%d}", fn.Idx)
-    result += pathString(fn.next)
-  case *matchSliceFn:
-    result += fmt.Sprintf("{%d:%d:%d}",
-      fn.Start, fn.End, fn.Step)
-    result += pathString(fn.next)
-  case *matchAnyFn:
-    result += "{}"
-    result += pathString(fn.next)
-  case *matchUnionFn:
-    result += "{["
-    for _, v := range fn.Union {
-      result += pathString(v) + ", "
-    }
-    result += "]}"
-  case *matchRecursiveFn:
-    result += "{}"
-    result += pathString(fn.next)
-  case *matchFilterFn:
-    result += fmt.Sprintf("{%s}", fn.Name)
-    result += pathString(fn.next)
-  case *matchScriptFn:
-    result += fmt.Sprintf("{%s}", fn.Name)
-    result += pathString(fn.next)
-  }
-  return result
+	result := fmt.Sprintf("%T:", root)
+	switch fn := root.(type) {
+	case *terminatingFn:
+		result += "{}"
+	case *matchKeyFn:
+		result += fmt.Sprintf("{%s}", fn.Name)
+		result += pathString(fn.next)
+	case *matchIndexFn:
+		result += fmt.Sprintf("{%d}", fn.Idx)
+		result += pathString(fn.next)
+	case *matchSliceFn:
+		result += fmt.Sprintf("{%d:%d:%d}",
+			fn.Start, fn.End, fn.Step)
+		result += pathString(fn.next)
+	case *matchAnyFn:
+		result += "{}"
+		result += pathString(fn.next)
+	case *matchUnionFn:
+		result += "{["
+		for _, v := range fn.Union {
+			result += pathString(v) + ", "
+		}
+		result += "]}"
+	case *matchRecursiveFn:
+		result += "{}"
+		result += pathString(fn.next)
+	case *matchFilterFn:
+		result += fmt.Sprintf("{%s}", fn.Name)
+		result += pathString(fn.next)
+	case *matchScriptFn:
+		result += fmt.Sprintf("{%s}", fn.Name)
+		result += pathString(fn.next)
+	}
+	return result
 }
 
 func assertPathMatch(t *testing.T, path, ref *Query) bool {
-  pathStr := pathString(path.root)
-  refStr := pathString(ref.root)
-  if pathStr != refStr {
-    t.Errorf("paths do not match")
-    t.Log("test:", pathStr)
-    t.Log("ref: ", refStr)
-    return false
-  }
-  return true
+	pathStr := pathString(path.root)
+	refStr := pathString(ref.root)
+	if pathStr != refStr {
+		t.Errorf("paths do not match")
+		t.Log("test:", pathStr)
+		t.Log("ref: ", refStr)
+		return false
+	}
+	return true
 }
 
 func assertPath(t *testing.T, query string, ref *Query) {
 	_, flow := lex(query)
 	path := parse(flow)
-  assertPathMatch(t, path, ref)
+	assertPathMatch(t, path, ref)
 }
 
-func buildPath(parts... PathFn) *Query {
-  query := newQuery()
-  for _, v := range parts {
-    query.appendPath(v)
-  }
-  return query
+func buildPath(parts ...PathFn) *Query {
+	query := newQuery()
+	for _, v := range parts {
+		query.appendPath(v)
+	}
+	return query
 }
 
 func TestPathRoot(t *testing.T) {
 	assertPath(t,
 		"$",
 		buildPath(
-      // empty
-    ))
+		// empty
+		))
 }
 
 func TestPathKey(t *testing.T) {
 	assertPath(t,
 		"$.foo",
 		buildPath(
-      newMatchKeyFn("foo"),
-    ))
+			newMatchKeyFn("foo"),
+		))
 }
 
 func TestPathBracketKey(t *testing.T) {
 	assertPath(t,
 		"$[foo]",
 		buildPath(
-      newMatchKeyFn("foo"),
-    ))
+			newMatchKeyFn("foo"),
+		))
 }
 
 func TestPathBracketStringKey(t *testing.T) {
 	assertPath(t,
 		"$['foo']",
 		buildPath(
-      newMatchKeyFn("foo"),
-    ))
+			newMatchKeyFn("foo"),
+		))
 }
 
 func TestPathIndex(t *testing.T) {
 	assertPath(t,
 		"$[123]",
 		buildPath(
-      newMatchIndexFn(123),
-    ))
+			newMatchIndexFn(123),
+		))
 }
 
 func TestPathSliceStart(t *testing.T) {
 	assertPath(t,
 		"$[123:]",
 		buildPath(
-      newMatchSliceFn(123, math.MaxInt64, 1),
-    ))
+			newMatchSliceFn(123, math.MaxInt64, 1),
+		))
 }
 
 func TestPathSliceStartEnd(t *testing.T) {
 	assertPath(t,
 		"$[123:456]",
 		buildPath(
-      newMatchSliceFn(123, 456, 1),
-    ))
+			newMatchSliceFn(123, 456, 1),
+		))
 }
 
 func TestPathSliceStartEndColon(t *testing.T) {
 	assertPath(t,
 		"$[123:456:]",
 		buildPath(
-      newMatchSliceFn(123, 456, 1),
-    ))
+			newMatchSliceFn(123, 456, 1),
+		))
 }
 
 func TestPathSliceStartStep(t *testing.T) {
 	assertPath(t,
 		"$[123::7]",
 		buildPath(
-      newMatchSliceFn(123, math.MaxInt64, 7),
-    ))
+			newMatchSliceFn(123, math.MaxInt64, 7),
+		))
 }
 
 func TestPathSliceEndStep(t *testing.T) {
 	assertPath(t,
 		"$[:456:7]",
 		buildPath(
-      newMatchSliceFn(0, 456, 7),
-    ))
+			newMatchSliceFn(0, 456, 7),
+		))
 }
 
 func TestPathSliceStep(t *testing.T) {
 	assertPath(t,
 		"$[::7]",
 		buildPath(
-      newMatchSliceFn(0, math.MaxInt64, 7),
-    ))
+			newMatchSliceFn(0, math.MaxInt64, 7),
+		))
 }
 
 func TestPathSliceAll(t *testing.T) {
 	assertPath(t,
 		"$[123:456:7]",
 		buildPath(
-      newMatchSliceFn(123, 456, 7),
-    ))
+			newMatchSliceFn(123, 456, 7),
+		))
 }
 
 func TestPathAny(t *testing.T) {
 	assertPath(t,
 		"$.*",
 		buildPath(
-      newMatchAnyFn(),
-    ))
+			newMatchAnyFn(),
+		))
 }
 
 func TestPathUnion(t *testing.T) {
 	assertPath(t,
 		"$[foo, bar, baz]",
 		buildPath(
-      &matchUnionFn{ []PathFn {
-        newMatchKeyFn("foo"),
-        newMatchKeyFn("bar"),
-        newMatchKeyFn("baz"),
-      }},
-    ))
+			&matchUnionFn{[]PathFn{
+				newMatchKeyFn("foo"),
+				newMatchKeyFn("bar"),
+				newMatchKeyFn("baz"),
+			}},
+		))
 }
 
 func TestPathRecurse(t *testing.T) {
 	assertPath(t,
 		"$..*",
 		buildPath(
-      newMatchRecursiveFn(),
-    ))
+			newMatchRecursiveFn(),
+		))
 }
 
 func TestPathFilterExpr(t *testing.T) {
 	assertPath(t,
 		"$[?('foo'),?(bar)]",
 		buildPath(
-      &matchUnionFn{ []PathFn {
-        newMatchFilterFn("foo", Position{}),
-        newMatchFilterFn("bar", Position{}),
-      }},
-    ))
+			&matchUnionFn{[]PathFn{
+				newMatchFilterFn("foo", Position{}),
+				newMatchFilterFn("bar", Position{}),
+			}},
+		))
 }
 
 func TestPathScriptExpr(t *testing.T) {
 	assertPath(t,
 		"$[('foo'),(bar)]",
 		buildPath(
-      &matchUnionFn{ []PathFn {
-        newMatchScriptFn("foo", Position{}),
-        newMatchScriptFn("bar", Position{}),
-      }},
-    ))
+			&matchUnionFn{[]PathFn{
+				newMatchScriptFn("foo", Position{}),
+				newMatchScriptFn("bar", Position{}),
+			}},
+		))
 }
diff --git a/jpath/parser.go b/jpath/parser.go
index f59ba0c..8e93457 100644
--- a/jpath/parser.go
+++ b/jpath/parser.go
@@ -16,7 +16,7 @@
 	flow         chan token
 	tokensBuffer []token
 	path         *Query
-  union        []PathFn
+	union        []PathFn
 }
 
 type parserStateFn func(*parser) parserStateFn
@@ -49,25 +49,25 @@
 	return &tok
 }
 
-func (p *parser) lookahead(types... tokenType) bool {
-  result := true
-  buffer := []token{}
+func (p *parser) lookahead(types ...tokenType) bool {
+	result := true
+	buffer := []token{}
 
-  for _, typ := range types {
-    tok := p.getToken()
-    if tok == nil {
-      result = false
-      break
-    }
-    buffer = append(buffer, *tok)
-    if tok.typ != typ {
-      result = false
-      break
-    }
-  }
-  // add the tokens back to the buffer, and return
-  p.tokensBuffer = append(p.tokensBuffer, buffer...)
-  return result
+	for _, typ := range types {
+		tok := p.getToken()
+		if tok == nil {
+			result = false
+			break
+		}
+		buffer = append(buffer, *tok)
+		if tok.typ != typ {
+			result = false
+			break
+		}
+	}
+	// add the tokens back to the buffer, and return
+	p.tokensBuffer = append(p.tokensBuffer, buffer...)
+	return result
 }
 
 func (p *parser) getToken() *token {
@@ -102,31 +102,31 @@
 	tok := p.getToken()
 	switch tok.typ {
 	case tokenDotDot:
-    p.path.appendPath(&matchRecursiveFn{})
-    // nested parse for '..'
-    tok := p.getToken()
-    switch tok.typ {
-    case tokenKey:
-      p.path.appendPath(newMatchKeyFn(tok.val))
-      return parseMatchExpr
-    case tokenLBracket:
-      return parseBracketExpr
-    case tokenStar:
-      // do nothing - the recursive predicate is enough
-      return parseMatchExpr
-    }
+		p.path.appendPath(&matchRecursiveFn{})
+		// nested parse for '..'
+		tok := p.getToken()
+		switch tok.typ {
+		case tokenKey:
+			p.path.appendPath(newMatchKeyFn(tok.val))
+			return parseMatchExpr
+		case tokenLBracket:
+			return parseBracketExpr
+		case tokenStar:
+			// do nothing - the recursive predicate is enough
+			return parseMatchExpr
+		}
 
 	case tokenDot:
-    // nested parse for '.'
-    tok := p.getToken()
-    switch tok.typ {
-    case tokenKey:
-      p.path.appendPath(newMatchKeyFn(tok.val))
-      return parseMatchExpr
-    case tokenStar:
-      p.path.appendPath(&matchAnyFn{})
-      return parseMatchExpr
-    }
+		// nested parse for '.'
+		tok := p.getToken()
+		switch tok.typ {
+		case tokenKey:
+			p.path.appendPath(newMatchKeyFn(tok.val))
+			return parseMatchExpr
+		case tokenStar:
+			p.path.appendPath(&matchAnyFn{})
+			return parseMatchExpr
+		}
 
 	case tokenLBracket:
 		return parseBracketExpr
@@ -139,38 +139,38 @@
 }
 
 func parseBracketExpr(p *parser) parserStateFn {
-  if p.lookahead(tokenInteger, tokenColon) {
-    return parseSliceExpr
-  }
-  if p.peek().typ == tokenColon {
-    return parseSliceExpr
-  }
+	if p.lookahead(tokenInteger, tokenColon) {
+		return parseSliceExpr
+	}
+	if p.peek().typ == tokenColon {
+		return parseSliceExpr
+	}
 	return parseUnionExpr
 }
 
 func parseUnionExpr(p *parser) parserStateFn {
-  var tok *token
+	var tok *token
 
-  // this state can be traversed after some sub-expressions
-  // so be careful when setting up state in the parser
+	// this state can be traversed after some sub-expressions
+	// so be careful when setting up state in the parser
 	if p.union == nil {
-    p.union = []PathFn{}
-  }
+		p.union = []PathFn{}
+	}
 
 loop: // labeled loop for easy breaking
-  for {
-    if len(p.union) > 0 {
-      // parse delimiter or terminator
-      tok = p.getToken()
-      switch tok.typ {
-      case tokenComma:
-        // do nothing
-      case tokenRBracket:
-        break loop
-      default:
-        p.raiseError(tok, "expected ',' or ']', not '%s'", tok.val)
-      }
-    }
+	for {
+		if len(p.union) > 0 {
+			// parse delimiter or terminator
+			tok = p.getToken()
+			switch tok.typ {
+			case tokenComma:
+				// do nothing
+			case tokenRBracket:
+				break loop
+			default:
+				p.raiseError(tok, "expected ',' or ']', not '%s'", tok.val)
+			}
+		}
 
 		// parse sub expression
 		tok = p.getToken()
@@ -190,14 +190,14 @@
 		}
 	}
 
-  // if there is only one sub-expression, use that instead
-  if len(p.union) == 1 {
-    p.path.appendPath(p.union[0])
-  }else {
-    p.path.appendPath(&matchUnionFn{p.union})
-  }
+	// if there is only one sub-expression, use that instead
+	if len(p.union) == 1 {
+		p.path.appendPath(p.union[0])
+	} else {
+		p.path.appendPath(&matchUnionFn{p.union})
+	}
 
-  p.union = nil // clear out state
+	p.union = nil // clear out state
 	return parseMatchExpr
 }
 
@@ -221,11 +221,11 @@
 		end = tok.Int()
 		tok = p.getToken()
 	}
-  if tok.typ == tokenRBracket {
-	  p.path.appendPath(newMatchSliceFn(start, end, step))
-    return parseMatchExpr
-  }
-  if tok.typ != tokenColon {
+	if tok.typ == tokenRBracket {
+		p.path.appendPath(newMatchSliceFn(start, end, step))
+		return parseMatchExpr
+	}
+	if tok.typ != tokenColon {
 		p.raiseError(tok, "expected ']' or ':'")
 	}
 
@@ -247,33 +247,33 @@
 }
 
 func parseFilterExpr(p *parser) parserStateFn {
-  tok := p.getToken()
-  if tok.typ != tokenLParen {
-    p.raiseError(tok, "expected left-parenthesis for filter expression")
-  }
-  tok = p.getToken()
-  if tok.typ != tokenKey && tok.typ != tokenString {
-    p.raiseError(tok, "expected key or string for filter funciton name")
-  }
-  name := tok.val
-  tok = p.getToken()
-  if tok.typ != tokenRParen {
-    p.raiseError(tok, "expected right-parenthesis for filter expression")
-  }
+	tok := p.getToken()
+	if tok.typ != tokenLParen {
+		p.raiseError(tok, "expected left-parenthesis for filter expression")
+	}
+	tok = p.getToken()
+	if tok.typ != tokenKey && tok.typ != tokenString {
+		p.raiseError(tok, "expected key or string for filter funciton name")
+	}
+	name := tok.val
+	tok = p.getToken()
+	if tok.typ != tokenRParen {
+		p.raiseError(tok, "expected right-parenthesis for filter expression")
+	}
 	p.union = append(p.union, newMatchFilterFn(name, tok.Position))
 	return parseUnionExpr
 }
 
 func parseScriptExpr(p *parser) parserStateFn {
-  tok := p.getToken()
-  if tok.typ != tokenKey && tok.typ != tokenString {
-    p.raiseError(tok, "expected key or string for script funciton name")
-  }
-  name := tok.val
-  tok = p.getToken()
-  if tok.typ != tokenRParen {
-    p.raiseError(tok, "expected right-parenthesis for script expression")
-  }
+	tok := p.getToken()
+	if tok.typ != tokenKey && tok.typ != tokenString {
+		p.raiseError(tok, "expected key or string for script funciton name")
+	}
+	name := tok.val
+	tok = p.getToken()
+	if tok.typ != tokenRParen {
+		p.raiseError(tok, "expected right-parenthesis for script expression")
+	}
 	p.union = append(p.union, newMatchScriptFn(name, tok.Position))
 	return parseUnionExpr
 }
diff --git a/jpath/parser_test.go b/jpath/parser_test.go
index 6d3c941..ec05f07 100644
--- a/jpath/parser_test.go
+++ b/jpath/parser_test.go
@@ -12,8 +12,8 @@
 		t.Errorf("Non-nil toml parse error: %v", err)
 		return
 	}
-  results := Compile(query).Execute(tree)
-	assertValue(t, results, ref, "((" + query + ")) -> ")
+	results := Compile(query).Execute(tree)
+	assertValue(t, results, ref, "(("+query+")) -> ")
 }
 
 func assertValue(t *testing.T, result, ref interface{}, location string) {
@@ -23,14 +23,14 @@
 			t.Errorf("{%s} result value not of type %T: %T",
 				location, node, resultNode)
 		} else {
-      if len(node) != len(resultNode) {
-        t.Errorf("{%s} lengths do not match: %v vs %v",
-          location, node, resultNode)
-      } else {
-        for i, v := range node {
-          assertValue(t, resultNode[i], v, fmt.Sprintf("%s[%d]", location, i))
-        }
-      }
+			if len(node) != len(resultNode) {
+				t.Errorf("{%s} lengths do not match: %v vs %v",
+					location, node, resultNode)
+			} else {
+				for i, v := range node {
+					assertValue(t, resultNode[i], v, fmt.Sprintf("%s[%d]", location, i))
+				}
+			}
 		}
 	case map[string]interface{}:
 		if resultNode, ok := result.(*TomlTree); !ok {
@@ -79,186 +79,186 @@
 }
 
 func TestQueryKey(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = 42",
-    "$.foo.a",
+	assertQuery(t,
+		"[foo]\na = 42",
+		"$.foo.a",
 		[]interface{}{
-		  int64(42),
-	  })
+			int64(42),
+		})
 }
 
 func TestQueryKeyString(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = 42",
-    "$.foo['a']",
+	assertQuery(t,
+		"[foo]\na = 42",
+		"$.foo['a']",
 		[]interface{}{
-		  int64(42),
-	  })
+			int64(42),
+		})
 }
 
 func TestQueryIndex(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
-    "$.foo.a[0]",
+	assertQuery(t,
+		"[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
+		"$.foo.a[0]",
 		[]interface{}{
-		  int64(1),
-	  })
+			int64(1),
+		})
 }
 
 func TestQuerySliceRange(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
-    "$.foo.a[0:5]",
+	assertQuery(t,
+		"[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
+		"$.foo.a[0:5]",
 		[]interface{}{
-		  int64(1),
-		  int64(2),
-		  int64(3),
-		  int64(4),
-		  int64(5),
-	  })
+			int64(1),
+			int64(2),
+			int64(3),
+			int64(4),
+			int64(5),
+		})
 }
 
 func TestQuerySliceStep(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
-    "$.foo.a[0:5:2]",
+	assertQuery(t,
+		"[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
+		"$.foo.a[0:5:2]",
 		[]interface{}{
-		  int64(1),
-		  int64(3),
-		  int64(5),
-	  })
+			int64(1),
+			int64(3),
+			int64(5),
+		})
 }
 
 func TestQueryAny(t *testing.T) {
-  assertQuery(t,
-    "[foo.bar]\na=1\nb=2\n[foo.baz]\na=3\nb=4",
-    "$.foo.*",
+	assertQuery(t,
+		"[foo.bar]\na=1\nb=2\n[foo.baz]\na=3\nb=4",
+		"$.foo.*",
 		[]interface{}{
-		  map[string]interface{}{
-		    "a": int64(1),
-		    "b": int64(2),
-      },
-		  map[string]interface{}{
-		    "a": int64(3),
-		    "b": int64(4),
-      },
-	  })
+			map[string]interface{}{
+				"a": int64(1),
+				"b": int64(2),
+			},
+			map[string]interface{}{
+				"a": int64(3),
+				"b": int64(4),
+			},
+		})
 }
 func TestQueryUnionSimple(t *testing.T) {
-  assertQuery(t,
-    "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
-    "$.*[bar,foo]",
+	assertQuery(t,
+		"[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
+		"$.*[bar,foo]",
 		[]interface{}{
-		  map[string]interface{}{
-		    "a": int64(1),
-		    "b": int64(2),
-      },
-		  map[string]interface{}{
-		    "a": int64(3),
-		    "b": int64(4),
-      },
-		  map[string]interface{}{
-		    "a": int64(5),
-		    "b": int64(6),
-      },
-	  })
+			map[string]interface{}{
+				"a": int64(1),
+				"b": int64(2),
+			},
+			map[string]interface{}{
+				"a": int64(3),
+				"b": int64(4),
+			},
+			map[string]interface{}{
+				"a": int64(5),
+				"b": int64(6),
+			},
+		})
 }
 
 func TestQueryRecursionAll(t *testing.T) {
-  assertQuery(t,
-    "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
-    "$..*",
+	assertQuery(t,
+		"[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
+		"$..*",
 		[]interface{}{
-		  map[string]interface{}{
-		    "bar": map[string]interface{}{
-          "a": int64(1),
-          "b": int64(2),
-        },
-      },
-		  map[string]interface{}{
-		    "a": int64(1),
-		    "b": int64(2),
-      },
-		  int64(1),
-		  int64(2),
-		  map[string]interface{}{
-        "foo": map[string]interface{}{
-          "a": int64(3),
-          "b": int64(4),
-        },
-      },
-		  map[string]interface{}{
-		    "a": int64(3),
-		    "b": int64(4),
-      },
-		  int64(3),
-		  int64(4),
-		  map[string]interface{}{
-        "foo": map[string]interface{}{
-          "a": int64(5),
-          "b": int64(6),
-        },
-      },
-		  map[string]interface{}{
-		    "a": int64(5),
-		    "b": int64(6),
-      },
-		  int64(5),
-		  int64(6),
-	  })
+			map[string]interface{}{
+				"bar": map[string]interface{}{
+					"a": int64(1),
+					"b": int64(2),
+				},
+			},
+			map[string]interface{}{
+				"a": int64(1),
+				"b": int64(2),
+			},
+			int64(1),
+			int64(2),
+			map[string]interface{}{
+				"foo": map[string]interface{}{
+					"a": int64(3),
+					"b": int64(4),
+				},
+			},
+			map[string]interface{}{
+				"a": int64(3),
+				"b": int64(4),
+			},
+			int64(3),
+			int64(4),
+			map[string]interface{}{
+				"foo": map[string]interface{}{
+					"a": int64(5),
+					"b": int64(6),
+				},
+			},
+			map[string]interface{}{
+				"a": int64(5),
+				"b": int64(6),
+			},
+			int64(5),
+			int64(6),
+		})
 }
 
 func TestQueryRecursionUnionSimple(t *testing.T) {
-  assertQuery(t,
-    "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
-    "$..['foo','bar']",
+	assertQuery(t,
+		"[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
+		"$..['foo','bar']",
 		[]interface{}{
-		  map[string]interface{}{
-		    "a": int64(1),
-		    "b": int64(2),
-      },
-		  map[string]interface{}{
-		    "a": int64(3),
-		    "b": int64(4),
-      },
-		  map[string]interface{}{
-		    "a": int64(5),
-		    "b": int64(6),
-      },
-	  })
+			map[string]interface{}{
+				"a": int64(1),
+				"b": int64(2),
+			},
+			map[string]interface{}{
+				"a": int64(3),
+				"b": int64(4),
+			},
+			map[string]interface{}{
+				"a": int64(5),
+				"b": int64(6),
+			},
+		})
 }
 
 func TestQueryScriptFnLast(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = [0,1,2,3,4,5,6,7,8,9]",
-    "$.foo.a[(last)]",
+	assertQuery(t,
+		"[foo]\na = [0,1,2,3,4,5,6,7,8,9]",
+		"$.foo.a[(last)]",
 		[]interface{}{
-		  int64(9),
-	  })
+			int64(9),
+		})
 }
 
 func TestQueryFilterFnOdd(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = [0,1,2,3,4,5,6,7,8,9]",
-    "$.foo.a[?(odd)]",
+	assertQuery(t,
+		"[foo]\na = [0,1,2,3,4,5,6,7,8,9]",
+		"$.foo.a[?(odd)]",
 		[]interface{}{
-		  int64(1),
-		  int64(3),
-		  int64(5),
-		  int64(7),
-		  int64(9),
-	  })
+			int64(1),
+			int64(3),
+			int64(5),
+			int64(7),
+			int64(9),
+		})
 }
 
 func TestQueryFilterFnEven(t *testing.T) {
-  assertQuery(t,
-    "[foo]\na = [0,1,2,3,4,5,6,7,8,9]",
-    "$.foo.a[?(even)]",
+	assertQuery(t,
+		"[foo]\na = [0,1,2,3,4,5,6,7,8,9]",
+		"$.foo.a[?(even)]",
 		[]interface{}{
-		  int64(0),
-		  int64(2),
-		  int64(4),
-		  int64(6),
-		  int64(8),
-	  })
+			int64(0),
+			int64(2),
+			int64(4),
+			int64(6),
+			int64(8),
+		})
 }
diff --git a/jpath/query.go b/jpath/query.go
index 082fa69..3bf306c 100644
--- a/jpath/query.go
+++ b/jpath/query.go
@@ -1,7 +1,7 @@
 package jpath
 
 import (
-  _ "github.com/pelletier/go-toml"
+	_ "github.com/pelletier/go-toml"
 )
 
 type nodeFilterFn func(node interface{}) bool
@@ -9,109 +9,108 @@
 
 // runtime context for executing query paths
 type queryContext struct {
-  filters *map[string]nodeFilterFn
-  scripts *map[string]nodeFn
-  results []interface{}
+	filters *map[string]nodeFilterFn
+	scripts *map[string]nodeFn
+	results []interface{}
 }
 
 func (c *queryContext) appendResult(value interface{}) {
-  c.results = append(c.results, value)
+	c.results = append(c.results, value)
 }
 
 // generic path functor interface
 type PathFn interface {
-  SetNext(next PathFn)
-  Call(node interface{}, ctx *queryContext)
+	SetNext(next PathFn)
+	Call(node interface{}, ctx *queryContext)
 }
 
 // encapsulates a query functor chain and script callbacks
 type Query struct {
-  root PathFn
-  tail PathFn
-  filters *map[string]nodeFilterFn
-  scripts *map[string]nodeFn
+	root    PathFn
+	tail    PathFn
+	filters *map[string]nodeFilterFn
+	scripts *map[string]nodeFn
 }
 
 func newQuery() *Query {
-  return &Query {
-    root: nil,
-    tail: nil,
-    filters: &defaultFilterFunctions,
-    scripts: &defaultScriptFunctions,
-  }
+	return &Query{
+		root:    nil,
+		tail:    nil,
+		filters: &defaultFilterFunctions,
+		scripts: &defaultScriptFunctions,
+	}
 }
 
 func (q *Query) appendPath(next PathFn) {
-  if q.root == nil {
-    q.root = next
-  } else {
-    q.tail.SetNext(next)
-  }
-  q.tail = next
-  next.SetNext(newTerminatingFn()) // init the next functor
+	if q.root == nil {
+		q.root = next
+	} else {
+		q.tail.SetNext(next)
+	}
+	q.tail = next
+	next.SetNext(newTerminatingFn()) // init the next functor
 }
 
 func Compile(path string) *Query {
-  _, flow := lex(path)
-  return parse(flow)
+	_, flow := lex(path)
+	return parse(flow)
 }
 
 func (q *Query) Execute(node interface{}) interface{} {
-  if q.root == nil {
-    return []interface{}{node} // identity query for no predicates
-  }
-  ctx := &queryContext {
-    filters: q.filters,
-    scripts: q.scripts,
-    results: []interface{}{},
-  }
-  q.root.Call(node, ctx)
-  return ctx.results
+	if q.root == nil {
+		return []interface{}{node} // identity query for no predicates
+	}
+	ctx := &queryContext{
+		filters: q.filters,
+		scripts: q.scripts,
+		results: []interface{}{},
+	}
+	q.root.Call(node, ctx)
+	return ctx.results
 }
 
 func (q *Query) SetFilter(name string, fn nodeFilterFn) {
-  if q.filters == &defaultFilterFunctions {
-    // clone the static table
-    q.filters = &map[string]nodeFilterFn{}
-    for k, v := range defaultFilterFunctions {
-      (*q.filters)[k] = v
-    }
-  }
-  (*q.filters)[name] = fn
+	if q.filters == &defaultFilterFunctions {
+		// clone the static table
+		q.filters = &map[string]nodeFilterFn{}
+		for k, v := range defaultFilterFunctions {
+			(*q.filters)[k] = v
+		}
+	}
+	(*q.filters)[name] = fn
 }
 
 func (q *Query) SetScript(name string, fn nodeFn) {
-  if q.scripts == &defaultScriptFunctions {
-    // clone the static table
-    q.scripts = &map[string]nodeFn{}
-    for k, v := range defaultScriptFunctions {
-      (*q.scripts)[k] = v
-    }
-  }
-  (*q.scripts)[name] = fn
+	if q.scripts == &defaultScriptFunctions {
+		// clone the static table
+		q.scripts = &map[string]nodeFn{}
+		for k, v := range defaultScriptFunctions {
+			(*q.scripts)[k] = v
+		}
+	}
+	(*q.scripts)[name] = fn
 }
 
-var defaultFilterFunctions = map[string]nodeFilterFn {
-  "odd":  func(node interface{}) bool {
-    if ii, ok := node.(int64); ok {
-      return (ii & 1) == 1
-    }
-    return false
-  },
-  "even": func(node interface{}) bool {
-    if ii, ok := node.(int64); ok {
-      return (ii & 1) == 0
-    }
-    return false
-  },
+var defaultFilterFunctions = map[string]nodeFilterFn{
+	"odd": func(node interface{}) bool {
+		if ii, ok := node.(int64); ok {
+			return (ii & 1) == 1
+		}
+		return false
+	},
+	"even": func(node interface{}) bool {
+		if ii, ok := node.(int64); ok {
+			return (ii & 1) == 0
+		}
+		return false
+	},
 }
 
-var defaultScriptFunctions = map[string]nodeFn {
-  "last": func(node interface{}) interface{} {
-    if arr, ok := node.([]interface{}); ok {
-      return len(arr)-1
-    }
-    return nil
-  },
+var defaultScriptFunctions = map[string]nodeFn{
+	"last": func(node interface{}) interface{} {
+		if arr, ok := node.([]interface{}); ok {
+			return len(arr) - 1
+		}
+		return nil
+	},
 }
-
