summaryrefslogtreecommitdiff
path: root/json
diff options
context:
space:
mode:
authorAdam Scarr <adam@vektah.net>2017-08-08 20:34:21 +1000
committerAdam Scarr <adam@vektah.net>2017-08-08 20:34:21 +1000
commit035af4d873d3de0685ab281be952e346547e40fd (patch)
tree3b72976a4ecf229189ce1685aa232cad34fb6f86 /json
parent73b55459ac724bc84c43159e820b90909dc63d51 (diff)
Add NumberLit parser and complete json spec
Diffstat (limited to 'json')
-rw-r--r--json/json.go16
-rw-r--r--json/json_test.go8
2 files changed, 11 insertions, 13 deletions
diff --git a/json/json.go b/json/json.go
index 4155bd2..7c84f42 100644
--- a/json/json.go
+++ b/json/json.go
@@ -21,23 +21,21 @@ var (
ret := map[string]interface{}{}
for _, prop := range n.Children[1].Children {
- ret[prop.Children[0].Token] = prop.Children[2].Result
+ ret[prop.Children[0].Result.(string)] = prop.Children[2].Result
}
return Node{Result: ret}
})
- _null = Bind("null", nil)
- _true = Bind("true", true)
- _false = Bind("false", false)
-
- _string = Map(StringLit(`"`), func(n Node) Node {
- return Node{Result: n.Token}
- })
+ _null = Bind("null", nil)
+ _true = Bind("true", true)
+ _false = Bind("false", false)
+ _string = StringLit(`"`)
+ _number = NumberLit()
)
func init() {
- value = Any(_null, _true, _false, _string, _array, _object)
+ value = Any(_null, _true, _false, _string, _number, _array, _object)
}
func Unmarshal(input string) (interface{}, error) {
diff --git a/json/json_test.go b/json/json_test.go
index 8f2e148..3cc7934 100644
--- a/json/json_test.go
+++ b/json/json_test.go
@@ -29,15 +29,15 @@ func TestUnmarshal(t *testing.T) {
})
t.Run("array", func(t *testing.T) {
- result, err := Unmarshal(`[true, null, false]`)
+ result, err := Unmarshal(`[true, null, false, -1.23e+4]`)
require.NoError(t, err)
- require.Equal(t, []interface{}{true, nil, false}, result)
+ require.Equal(t, []interface{}{true, nil, false, -1.23e+4}, result)
})
t.Run("object", func(t *testing.T) {
- result, err := Unmarshal(`{"true":true, "false":false, "null": null} `)
+ result, err := Unmarshal(`{"true":true, "false":false, "null": null, "number": 404} `)
require.NoError(t, err)
- require.Equal(t, map[string]interface{}{"true": true, "false": false, "null": nil}, result)
+ require.Equal(t, map[string]interface{}{"true": true, "false": false, "null": nil, "number": int64(404)}, result)
})
}