aboutsummaryrefslogtreecommitdiff
path: root/core/encoding/json/parser.odin
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-08-08 12:59:35 +0100
committergingerBill <bill@gingerbill.org>2021-08-08 12:59:35 +0100
commitdb3501f61b6fd0ba9ec5b0ba06bd8188292810a7 (patch)
tree77059260489b49fe2355893199c439525e5db73f /core/encoding/json/parser.odin
parent48538aa792e424536b900ddfd44336d7138904f9 (diff)
[Breaking] Change the layout `json.Value` to be a `union` rather than a `struct` of a `json.Pos` and the union
Diffstat (limited to 'core/encoding/json/parser.odin')
-rw-r--r--core/encoding/json/parser.odin34
1 files changed, 10 insertions, 24 deletions
diff --git a/core/encoding/json/parser.odin b/core/encoding/json/parser.odin
index 54cf9b6ef..57b68946b 100644
--- a/core/encoding/json/parser.odin
+++ b/core/encoding/json/parser.odin
@@ -68,36 +68,33 @@ expect_token :: proc(p: ^Parser, kind: Token_Kind) -> Error {
parse_value :: proc(p: ^Parser) -> (value: Value, err: Error) {
- value.pos = p.curr_token.pos;
- defer value.end = token_end_pos(p.prev_token);
-
token := p.curr_token;
#partial switch token.kind {
case .Null:
- value.value = Null{};
+ value = Null{};
advance_token(p);
return;
case .False:
- value.value = Boolean(false);
+ value = Boolean(false);
advance_token(p);
return;
case .True:
- value.value = Boolean(true);
+ value = Boolean(true);
advance_token(p);
return;
case .Integer:
i, _ := strconv.parse_i64(token.text);
- value.value = Integer(i);
+ value = Integer(i);
advance_token(p);
return;
case .Float:
f, _ := strconv.parse_f64(token.text);
- value.value = Float(f);
+ value = Float(f);
advance_token(p);
return;
case .String:
- value.value = String(unquote_string(token, p.spec, p.allocator));
+ value = String(unquote_string(token, p.spec, p.allocator));
advance_token(p);
return;
@@ -115,7 +112,7 @@ parse_value :: proc(p: ^Parser) -> (value: Value, err: Error) {
if token.text[0] == '-' {
inf = 0xfff0000000000000;
}
- value.value = transmute(f64)inf;
+ value = transmute(f64)inf;
advance_token(p);
return;
case .NaN:
@@ -123,7 +120,7 @@ parse_value :: proc(p: ^Parser) -> (value: Value, err: Error) {
if token.text[0] == '-' {
nan = 0xfff7ffffffffffff;
}
- value.value = transmute(f64)nan;
+ value = transmute(f64)nan;
advance_token(p);
return;
}
@@ -136,8 +133,6 @@ parse_value :: proc(p: ^Parser) -> (value: Value, err: Error) {
}
parse_array :: proc(p: ^Parser) -> (value: Value, err: Error) {
- value.pos = p.curr_token.pos;
- defer value.end = token_end_pos(p.prev_token);
if err = expect_token(p, .Open_Bracket); err != .None {
return;
}
@@ -171,7 +166,7 @@ parse_array :: proc(p: ^Parser) -> (value: Value, err: Error) {
return;
}
- value.value = array;
+ value = array;
return;
}
@@ -205,11 +200,7 @@ parse_object_key :: proc(p: ^Parser) -> (key: string, err: Error) {
}
parse_object :: proc(p: ^Parser) -> (value: Value, err: Error) {
- value.pos = p.curr_token.pos;
- defer value.end = token_end_pos(p.prev_token);
-
if err = expect_token(p, .Open_Brace); err != .None {
- value.pos = p.curr_token.pos;
return;
}
@@ -228,26 +219,22 @@ parse_object :: proc(p: ^Parser) -> (value: Value, err: Error) {
key, err = parse_object_key(p);
if err != .None {
delete(key, p.allocator);
- value.pos = p.curr_token.pos;
return;
}
if colon_err := expect_token(p, .Colon); colon_err != .None {
err = .Expected_Colon_After_Key;
- value.pos = p.curr_token.pos;
return;
}
elem, elem_err := parse_value(p);
if elem_err != .None {
err = elem_err;
- value.pos = p.curr_token.pos;
return;
}
if key in obj {
err = .Duplicate_Object_Key;
- value.pos = p.curr_token.pos;
delete(key, p.allocator);
return;
}
@@ -270,11 +257,10 @@ parse_object :: proc(p: ^Parser) -> (value: Value, err: Error) {
}
if err = expect_token(p, .Close_Brace); err != .None {
- value.pos = p.curr_token.pos;
return;
}
- value.value = obj;
+ value = obj;
return;
}