flexpiler/common/rustc/deserializer/
option.rs

1use crate::common::rustc::block;
2use crate::deserializer;
3use crate::error;
4use crate::parser;
5use crate::reader;
6use crate::deserializer::Result::DataFound;
7
8
9pub struct Option;
10
11
12impl<DataType> crate::identity::Trait for std::option::Option<DataType>
13where DataType: crate::identity::Trait {
14    fn definition() -> String {
15        std::string::String::from(format!("Option<{}>", DataType::definition()))
16    }
17}
18
19
20impl<DataType> crate::deserializer::Trait<
21    std::option::Option<DataType>,
22    crate::common::rustc::Format,
23> for Option
24where DataType: crate::Deserialization<crate::common::rustc::Format>
25                + crate::identity::Trait
26{
27    fn deserialize<ReaderType>(reader_mut_ref: &mut ReaderType)
28        -> crate::deserializer::Result<std::option::Option<DataType>, crate::common::rustc::deserializer::Context, error::Error<crate::common::rustc::error::Source>>
29    where ReaderType: reader::Trait {
30        use crate::deserializer::context::Trait as DeserializerContextTrait;
31        use crate::error::propagation::Trait as PropagationTrait;
32        use crate::error::Trait as ErrorTrait;
33        use crate::parser::Parse;
34
35        let (identifier, identifier_context) = match block::Identifier::parse(reader_mut_ref) {
36            Err(parser_error) => {
37                let error = error::Error::gen(parser_error)
38                    .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
39                return deserializer::Result::Err(error);
40            },
41            Ok(block::identifier::Result::NoDataFound { finish }) => {
42                return deserializer::Result::NoDataFound { context: finish.into() };
43            },
44            Ok(block::identifier::Result::DataFound { data, finish }) => {
45                let context: crate::common::rustc::deserializer::Context = finish.into();
46                (data, context)
47            },
48        };
49
50        let result = match identifier.as_str() {
51            "None"
52            | "Option::None" => {
53                crate::deserializer::Result::DataFound {
54                    data: std::option::Option::None,
55                    context: identifier_context,
56                }
57            },
58
59            "Some"
60            | "Option::Some" => {
61                match identifier_context {
62                    crate::common::rustc::deserializer::Context::Freestanding => {
63                        match crate::parser::parse::<
64                            crate::common::rustc::block::ArgumentStart,
65                            ReaderType
66                        >(reader_mut_ref) {
67                            Ok(result) => {},
68                            Err(parser_error) => {
69                                let error = crate::error::Error::gen(parser_error)
70                                    .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
71                                return deserializer::Result::Err(error);
72                            },
73                        }
74                    },
75                    crate::common::rustc::deserializer::Context::ArgumentStart => {
76                    },
77                    _ => {
78                        let incompatible_enum_data_type = crate::common::rustc::error::IncompatibleEnumDataType {
79                            enum_declaration_found: identifier,
80                            enum_data_type_expected: crate::common::rustc::error::incompatibleenumdataType::EnumDataType::Argument,
81                            context_found: identifier_context,
82                        };
83                        let error = crate::Error::gen(incompatible_enum_data_type)
84                            .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
85                        return deserializer::Result::Err(error);
86                    }
87                }
88
89                let (argument_0_data, argument_0_context) = match <DataType::Deserializer as crate::deserializer::Trait<DataType, crate::common::rustc::Format>>::deserialize(reader_mut_ref) {
90                    deserializer::Result::DataFound{ data, context} => (data, context),
91                    deserializer::Result::NoDataFound { context } => {
92                        let unexpected_no_content = crate::common::rustc::error::MissingEnumArgument {
93                            enum_declaration_found: identifier,
94                            argument_type_expected: DataType::definition(),
95                        };
96                        let error = crate::Error::gen(unexpected_no_content)
97                            .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
98                        return deserializer::Result::Err(error);
99                    }
100                    deserializer::Result::Err(error) => {
101                        let error = error
102                            .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
103                        return deserializer::Result::Err(error);
104                    },
105                };
106
107                match argument_0_context {
108                    crate::common::rustc::deserializer::Context::ArgumentEnd => {},
109                    crate::common::rustc::deserializer::Context::Freestanding => {
110                        match crate::common::rustc::block::ArgumentEnd::parse(reader_mut_ref) {
111                            Ok(_) => {
112                            }
113                            Err(parser_error) => {
114                                let error = crate::error::Error::gen(parser_error)
115                                    .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
116                                return deserializer::Result::Err(error);
117                            }
118                        }
119                    },
120                    _ => {
121                        let missing_argument_closure = crate::common::rustc::error::MissingEnumArgumentClosure{
122                            enum_declaration_found: identifier,
123                        };
124                        let error = crate::Error::gen(missing_argument_closure)
125                            .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
126                        return deserializer::Result::Err(error);
127                    },
128                }
129
130                let context = crate::common::rustc::deserializer::Context::Freestanding;
131                crate::deserializer::Result::DataFound {
132                    data: Some(argument_0_data),
133                    context
134                }
135            },
136
137            _ => {
138                let incompatible_declaration_found = crate::common::rustc::error::IncompatibleEnumDeclaration {
139                    enum_declaration_found: identifier,
140                    enum_declaration_expected_entries: error::ExpectedEntries::from(vec![
141                        std::string::String::from("Some"),
142                        std::string::String::from("Option::Some"),
143                        std::string::String::from("None"),
144                        std::string::String::from("Option::None"),
145                    ]),
146                };
147                let error = crate::Error::gen(incompatible_declaration_found)
148                    .propagate(<Option as crate::deserializer::context::Trait<std::option::Option<DataType>, crate::common::rustc::Format>>::context());
149                return deserializer::Result::Err(error);
150            },
151        };
152
153        return result;
154    }
155}
156
157
158impl<DataType> crate::Deserialization<crate::common::rustc::Format> for std::option::Option<DataType>
159where DataType: crate::Deserialization<crate::common::rustc::Format>
160                + crate::identity::Trait
161{
162    type Deserializer = Option;
163}