1/*
2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors.
3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com>
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include <cassert>
10#include <libfoundation/json/Parser.h>
11#include <unistd.h>
12
13namespace LFoundation::Json {
14
15StringObject* Parser::parse_string()
16{
17 auto* res = new StringObject();
18
19 m_lexer.skip_spaces();
20 assert(m_lexer.eat_token('\"'));
21 m_lexer.eat_string(res->data());
22 assert(m_lexer.eat_token('\"'));
23 return res;
24}
25
26DictObject* Parser::parse_dict()
27{
28 auto* res = new DictObject();
29
30 m_lexer.skip_spaces();
31 assert(m_lexer.eat_token('{'));
32 for (;;) {
33 auto left = parse_string();
34 assert(m_lexer.eat_token(':'));
35 auto right_obj = parse_object();
36 res->data()[left->data()] = right_obj;
37
38 if (m_lexer.lookup_char() == ',') {
39 assert(m_lexer.eat_token(','));
40 } else {
41 break;
42 }
43 }
44 assert(m_lexer.eat_token('}'));
45 return res;
46}
47
48Object* Parser::parse_object()
49{
50 m_lexer.skip_spaces();
51 switch (m_lexer.lookup_char()) {
52 case '{':
53 return parse_dict();
54 case '\"':
55 return parse_string();
56 default:
57 assert(false);
58 }
59 return new DictObject();
60}
61
62}