flexpiler/common/rustc/deserializer/
vec.rs1use crate::common::rustc::block as block;
2use crate::error;
3use crate::error::Trait;
4use crate::parser;
5use crate::reader;
6
7
8pub struct Vec;
9
10
11impl<DataType> crate::identity::Trait for std::vec::Vec<DataType>
12 where DataType: crate::identity::Trait {
13 fn definition() -> String {
14 String::from(format!("Vec<{}>", DataType::definition()))
15 }
16}
17
18
19impl<DataType> crate::deserializer::Trait<
20 std::vec::Vec<DataType>,
21 crate::common::rustc::Format
22> for Vec
23where DataType: crate::Deserialization<crate::common::rustc::Format>
24 + crate::identity::Trait
25{
26 fn deserialize<ReaderType>(reader_mut_ref: &mut ReaderType)
27 -> crate::deserializer::Result<std::vec::Vec<DataType>, crate::common::rustc::deserializer::Context, error::Error<crate::common::rustc::error::Source>>
28 where ReaderType: reader::Trait {
29 use crate::deserializer::context::Trait as DeserializerContextTrait;
30 use crate::error::Trait as ErrorTrait;
31 use crate::error::propagation::Trait as PropagationTrait;
32 use crate::parser::Parse;
33
34 match block::Identifier::parse(reader_mut_ref) {
38 Err(parser_error) => {
39 let error = error::Error::gen(parser_error)
40 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
41 return crate::deserializer::Result::Err(error);
42 },
43 Ok(block::identifier::Result::NoDataFound { finish }) => {
44 let context: crate::common::rustc::deserializer::Context = finish.into();
45 match &context {
46 crate::common::rustc::deserializer::Context::ListStart => {},
47 _ => {
48 return crate::deserializer::Result::NoDataFound { context };
49 }
50 }
51 },
52 Ok(block::identifier::Result::DataFound { data, finish }) => {
53 match data.as_str() {
54 "vec!" => {
55 let mut context: crate::common::rustc::deserializer::Context = finish.into();
56 if context == crate::common::rustc::deserializer::Context::Freestanding {
57 context = match block::ContextDenominator::parse(reader_mut_ref) {
58 Ok(result) => {
59 result.finish.into()
60 },
61 Err(parser_error) => {
62 let error = error::Error::gen(parser_error)
63 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
64 return crate::deserializer::Result::Err(error);
65 }
66 };
67 }
68 match &context {
69 crate::common::rustc::deserializer::Context::ListStart => {},
70 _ => {
71 let unexpected_context = crate::common::rustc::error::UnexpectedContext {
72 context_found: context,
73 context_expected: crate::error::ExpectedEntries::from(vec![
74 crate::common::rustc::deserializer::Context::ListStart
75 ]),
76 };
77 let error = error::Error::gen(unexpected_context)
78 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
79 return crate::deserializer::Result::Err(error);
80 }
81 }
82 },
83 "Vec::new"
84 | "std::vec::Vec::new"=> {
85 let mut context: crate::common::rustc::deserializer::Context = finish.into();
86 if context == crate::common::rustc::deserializer::Context::Freestanding {
87 context = match block::ContextDenominator::parse(reader_mut_ref) {
88 Ok(result) => {
89 result.finish.into()
90 },
91 Err(parser_error) => {
92 let error = error::Error::gen(parser_error)
93 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
94 return crate::deserializer::Result::Err(error);
95 }
96 };
97 }
98 match context {
99 crate::common::rustc::deserializer::Context::ArgumentStart => {},
100 _ => {
101 let unexpected_context = crate::common::rustc::error::UnexpectedContext {
102 context_expected: crate::error::ExpectedEntries::from(vec![
103 crate::common::rustc::deserializer::Context::ArgumentStart,
104 ]),
105 context_found: context,
106 };
107 let error = crate::Error::gen(unexpected_context)
108 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
109 return crate::deserializer::Result::Err(error);
110 }
111 };
112 let context_result = match block::ContextDenominator::parse(reader_mut_ref) {
113 Ok(result) => result,
114 Err(parser_error) => {
115 let error = crate::Error::gen(parser_error)
116 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
117 return crate::deserializer::Result::Err(error);
118 }
119 };
120 let context: crate::common::rustc::deserializer::Context = context_result.finish.into();
121 match context {
122 crate::common::rustc::deserializer::Context::ArgumentEnd => {},
123 _ => {
124 let unexpected_context = crate::common::rustc::error::UnexpectedContext {
125 context_expected: crate::error::ExpectedEntries::from(vec![
126 crate::common::rustc::deserializer::Context::ArgumentStart,
127 ]),
128 context_found: context,
129 };
130 let error = crate::Error::gen(unexpected_context)
131 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
132 return crate::deserializer::Result::Err(error);
133 }
134 }
135
136 return crate::deserializer::Result::DataFound {
137 data: std::vec::Vec::new(),
138 context: crate::common::rustc::deserializer::Context::Freestanding,
139 };
140 },
141 _ => {
142 let incompatible_vector_declaration = crate::common::rustc::error::IncompatibleVectorDeclaration {
143 vector_declaration_found: data,
144 };
145 let error = crate::Error::gen(incompatible_vector_declaration)
146 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
147 return crate::deserializer::Result::Err(error);
148 }
149 }
150 },
151 }
152
153 let mut data_vec = std::vec::Vec::new();
154 let mut context = crate::common::rustc::deserializer::Context::Freestanding;
155 loop {
156 let data_result = DataType::Deserializer::deserialize(reader_mut_ref);
157 context = match data_result {
158 crate::deserializer::Result::DataFound{ data, context } => {
159 data_vec.push(data);
160 context
161 },
162 crate::deserializer::Result::NoDataFound { context } => {
163 context
164 },
165 crate::deserializer::Result::Err(error) => {
166 let error = error.propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
167 return crate::deserializer::Result::Err(error);
168 },
169 };
170
171 if context == crate::common::rustc::deserializer::Context::Freestanding {
172 let context_denominator_result = match block::ContextDenominator::parse(reader_mut_ref) {
173 Ok(result) => result,
174 Err(parser_error) => {
175 let error = crate::Error::gen(parser_error)
176 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
177 return crate::deserializer::Result::Err(error);
178 }
179 };
180 context = context_denominator_result.finish.into();
181 }
182
183 match context {
184 crate::common::rustc::deserializer::Context::ListEnd => {
185 break;
186 },
187 crate::common::rustc::deserializer::Context::Separator => {
188 continue;
189 },
190 _ => {
191 let unexpected_context = crate::common::rustc::error::UnexpectedContext {
192 context_found: context,
193 context_expected: crate::error::ExpectedEntries::from(vec![
194 crate::common::rustc::deserializer::Context::ListEnd,
195 crate::common::rustc::deserializer::Context::Separator,
196 ]),
197 };
198
199 let error = crate::Error::gen(unexpected_context)
200 .propagate(<Vec as crate::deserializer::context::Trait<std::vec::Vec<DataType>, crate::common::rustc::Format>>::context());
201 return crate::deserializer::Result::Err(error);
202 },
203 }
204 }
205
206 return crate::deserializer::Result::DataFound{
207 data: data_vec,
208 context,
209 };
210 }
211}
212
213
214impl<DataType> crate::Deserialization<crate::common::rustc::Format> for std::vec::Vec<DataType>
215where DataType: crate::Deserialization<crate::common::rustc::Format>
216 + crate::identity::Trait
217{
218 type Deserializer = Vec;
219}