1use super::{
2 any_state::AnyState, const_state::ConstState, json_state::JsonState, shared::ParseError,
3};
4use crate::{mem::manager::Manager, tokenizer::JsonToken};
5
6#[derive(Debug)]
7pub enum RootStatus {
8 Initial,
9 Export,
10 Module,
11 ModuleDot,
12 ModuleDotExports,
13 Const,
14 ConstId(String),
15 Import,
16 ImportId(String),
17 ImportIdFrom(String),
18}
19
20pub struct RootState<M: Manager> {
21 pub status: RootStatus,
22 pub state: AnyState<M>,
23 pub new_line: bool,
24}
25
26impl<M: Manager> RootState<M> {
27 pub fn parse(
28 self,
29 manager: M,
30 token: JsonToken<M::Dealloc>,
31 ) -> (
32 JsonState<M>,
33 Option<(String, String)>,
34 ) {
35 match self.status {
36 RootStatus::Initial => match token {
37 JsonToken::NewLine => (
38 JsonState::ParseRoot(RootState {
39 new_line: true,
40 ..self
41 }),
42 None,
43 ),
44 JsonToken::Id(s) => match self.new_line {
45 true => match s.as_ref() {
46 "const" => (
47 JsonState::ParseRoot(RootState {
48 status: RootStatus::Const,
49 state: self.state.set_djs(),
50 new_line: false,
51 }),
52 None,
53 ),
54 "export" if self.state.data_type.is_mjs_compatible() => (
55 JsonState::ParseRoot(RootState {
56 status: RootStatus::Export,
57 state: self.state.set_mjs(),
58 new_line: false,
59 }),
60 None,
61 ),
62 "module" if self.state.data_type.is_cjs_compatible() => (
63 JsonState::ParseRoot(RootState {
64 status: RootStatus::Module,
65 state: self.state.set_cjs(),
66 new_line: false,
67 }),
68 None,
69 ),
70 "import" if self.state.data_type.is_mjs_compatible() => (
71 JsonState::ParseRoot(RootState {
72 status: RootStatus::Import,
73 state: self.state.set_mjs(),
74 new_line: false,
75 }),
76 None,
77 ),
78 _ => {
79 let (json_state, _module_name) =
80 self.state.parse_for_module(manager, JsonToken::Id(s));
81 (json_state, None)
83 }
84 },
85 false => (JsonState::Error(ParseError::NewLineExpected), None),
86 },
87 _ => match self.new_line {
88 true => {
89 let (json_state, _module_name) =
90 self.state.parse_for_module(manager, token);
91 (json_state, None)
93 }
94 false => (JsonState::Error(ParseError::NewLineExpected), None),
95 },
96 },
97 RootStatus::Export => match token {
98 JsonToken::Id(s) => match s.as_ref() {
99 "default" => (JsonState::ParseModule(self.state), None),
100 _ => (JsonState::Error(ParseError::WrongExportStatement), None),
101 },
102 _ => (JsonState::Error(ParseError::WrongExportStatement), None),
103 },
104 RootStatus::Module => match token {
105 JsonToken::Dot => (
106 JsonState::ParseRoot(RootState {
107 status: RootStatus::ModuleDot,
108 state: self.state,
109 new_line: false,
110 }),
111 None,
112 ),
113 _ => (JsonState::Error(ParseError::WrongExportStatement), None),
114 },
115 RootStatus::ModuleDot => match token {
116 JsonToken::Id(s) => match s.as_ref() {
117 "exports" => (
118 JsonState::ParseRoot(RootState {
119 status: RootStatus::ModuleDotExports,
120 state: self.state,
121 new_line: false,
122 }),
123 None,
124 ),
125 _ => (JsonState::Error(ParseError::WrongExportStatement), None),
126 },
127 _ => (JsonState::Error(ParseError::WrongExportStatement), None),
128 },
129 RootStatus::ModuleDotExports => match token {
130 JsonToken::Equals => (JsonState::ParseModule(self.state), None),
131 _ => (JsonState::Error(ParseError::WrongExportStatement), None),
132 },
133 RootStatus::Const => match token {
134 JsonToken::Id(s) => (
135 JsonState::ParseRoot(RootState {
136 status: RootStatus::ConstId(s),
137 state: self.state,
138 new_line: false,
139 }),
140 None,
141 ),
142 _ => (JsonState::Error(ParseError::WrongConstStatement), None),
143 },
144 RootStatus::ConstId(s) => match token {
145 JsonToken::Equals => (
146 JsonState::ParseConst(ConstState {
147 key: s,
148 state: self.state,
149 }),
150 None,
151 ),
152 _ => (JsonState::Error(ParseError::WrongConstStatement), None),
153 },
154 RootStatus::Import => match token {
155 JsonToken::Id(s) => (
156 JsonState::ParseRoot(RootState {
157 status: RootStatus::ImportId(s),
158 state: self.state,
159 new_line: false,
160 }),
161 None,
162 ),
163 _ => (JsonState::Error(ParseError::WrongImportStatement), None),
164 },
165 RootStatus::ImportId(id) => match token {
166 JsonToken::Id(s) => match s.as_ref() {
167 "from" => (
168 JsonState::ParseRoot(RootState {
169 status: RootStatus::ImportIdFrom(id),
170 state: self.state,
171 new_line: false,
172 }),
173 None,
174 ),
175 _ => (JsonState::Error(ParseError::WrongImportStatement), None),
176 },
177 _ => (JsonState::Error(ParseError::WrongImportStatement), None),
178 },
179 RootStatus::ImportIdFrom(id) => match token {
180 JsonToken::String(module) => (
181 JsonState::ParseRoot(RootState {
182 status: RootStatus::Initial,
183 new_line: false,
184 ..self
185 }),
186 Some((id, module)),
187 ),
188 _ => (JsonState::Error(ParseError::WrongImportStatement), None),
189 },
190 }
191 }
192}