@@ -44,11 +44,11 @@ class TYqlTypeParser {
4444
4545private:
4646 struct TypeNode {
47- TTypeParser::ETypeKind TypeKind;
47+ std::optional< TTypeParser::ETypeKind> TypeKind = std:: nullopt ;
4848 std::vector<TypeNode> Children;
4949
5050 // For primitive type
51- EPrimitiveType PrimitiveType;
51+ std::optional< EPrimitiveType> PrimitiveType = std:: nullopt ;
5252
5353 // For struct type
5454 TString Name;
@@ -218,14 +218,6 @@ class TYqlTypeParser {
218218 node.PrimitiveType = EPrimitiveType::JsonDocument;
219219 } else if (content == " dynumber" ) {
220220 node.PrimitiveType = EPrimitiveType::DyNumber;
221- } else if (content == " emptylist" ) {
222- node.TypeKind = TTypeParser::ETypeKind::EmptyList;
223- } else if (content == " emptydict" ) {
224- node.TypeKind = TTypeParser::ETypeKind::EmptyDict;
225- } else if (content == " void" ) {
226- node.TypeKind = TTypeParser::ETypeKind::Void;
227- } else if (content == " null" ) {
228- node.TypeKind = TTypeParser::ETypeKind::Null;
229221 } else {
230222 return std::nullopt ;
231223 }
@@ -273,39 +265,58 @@ class TYqlTypeParser {
273265 }
274266
275267 bool BuildType (const TypeNode& node, TTypeBuilder& builder) {
276- if (node.TypeKind == TTypeParser::ETypeKind::Optional) {
268+ if (!node.TypeKind .has_value ()) {
269+ return false ;
270+ }
271+
272+ if (*node.TypeKind == TTypeParser::ETypeKind::Optional) {
277273 builder.BeginOptional ();
278- BuildType (node.Children [0 ], builder);
274+ if (!BuildType (node.Children [0 ], builder)) {
275+ return false ;
276+ }
279277 builder.EndOptional ();
280- } else if (node.TypeKind == TTypeParser::ETypeKind::List) {
278+ } else if (* node.TypeKind == TTypeParser::ETypeKind::List) {
281279 builder.BeginList ();
282- BuildType (node.Children [0 ], builder);
280+ if (!BuildType (node.Children [0 ], builder)) {
281+ return false ;
282+ }
283283 builder.EndList ();
284- } else if (node.TypeKind == TTypeParser::ETypeKind::Struct) {
284+ } else if (* node.TypeKind == TTypeParser::ETypeKind::Struct) {
285285 builder.BeginStruct ();
286286 for (const auto & field : node.Children ) {
287287 builder.AddMember (field.Name );
288- BuildType (field, builder);
288+ if (!BuildType (field, builder)) {
289+ return false ;
290+ }
289291 }
290292 builder.EndStruct ();
291- } else if (node.TypeKind == TTypeParser::ETypeKind::Tuple) {
293+ } else if (* node.TypeKind == TTypeParser::ETypeKind::Tuple) {
292294 builder.BeginTuple ();
293295 for (const auto & element : node.Children ) {
294296 builder.AddElement ();
295- BuildType (element, builder);
297+ if (!BuildType (element, builder)) {
298+ return false ;
299+ }
296300 }
297301 builder.EndTuple ();
298- } else if (node.TypeKind == TTypeParser::ETypeKind::Dict) {
302+ } else if (* node.TypeKind == TTypeParser::ETypeKind::Dict) {
299303 builder.BeginDict ();
300304 builder.DictKey ();
301- BuildType (node.Children [0 ], builder);
305+ if (!BuildType (node.Children [0 ], builder)) {
306+ return false ;
307+ }
302308 builder.DictPayload ();
303- BuildType (node.Children [1 ], builder);
309+ if (!BuildType (node.Children [1 ], builder)) {
310+ return false ;
311+ }
304312 builder.EndDict ();
305- } else if (node.TypeKind == TTypeParser::ETypeKind::Decimal) {
313+ } else if (* node.TypeKind == TTypeParser::ETypeKind::Decimal) {
306314 builder.Decimal (TDecimalType (node.precision , node.scale ));
307- } else if (node.TypeKind == TTypeParser::ETypeKind::Primitive) {
308- builder.Primitive (node.PrimitiveType );
315+ } else if (*node.TypeKind == TTypeParser::ETypeKind::Primitive) {
316+ if (!node.PrimitiveType .has_value ()) {
317+ return false ;
318+ }
319+ builder.Primitive (*node.PrimitiveType );
309320 } else {
310321 return false ;
311322 }
0 commit comments