flexpiler/common/rustc/deserializer/
vec.rs

1use 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        // Vec::new()
35        // vec![ #(element,)* ]
36        // [#(element,)*]
37        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}