flexpiler/common/rustc/deserializer/
option.rs1use 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}