@@ -612,6 +612,53 @@ auto handle_allof(const sourcemeta::core::JSON &schema,
612612 std::move (branches)};
613613}
614614
615+ auto handle_if_then_else (
616+ const sourcemeta::core::JSON &schema,
617+ const sourcemeta::core::SchemaFrame &frame,
618+ const sourcemeta::core::SchemaFrame::Location &location,
619+ const sourcemeta::core::Vocabularies &,
620+ const sourcemeta::core::SchemaResolver &,
621+ const sourcemeta::core::JSON &subschema) -> IREntity {
622+ ONLY_WHITELIST_KEYWORDS (schema, subschema, location.pointer ,
623+ {" $schema" , " $id" , " $anchor" , " $dynamicAnchor" ,
624+ " $defs" , " $vocabulary" , " if" , " then" , " else" ,
625+ " title" , " description" , " default" , " deprecated" ,
626+ " readOnly" , " writeOnly" , " examples" ,
627+ " unevaluatedProperties" , " unevaluatedItems" });
628+
629+ assert (subschema.defines (" if" ));
630+ assert (subschema.defines (" then" ));
631+ assert (subschema.defines (" else" ));
632+
633+ auto if_pointer{sourcemeta::core::to_pointer (location.pointer )};
634+ if_pointer.push_back (" if" );
635+ const auto if_location{
636+ frame.traverse (sourcemeta::core::to_weak_pointer (if_pointer))};
637+ assert (if_location.has_value ());
638+
639+ auto then_pointer{sourcemeta::core::to_pointer (location.pointer )};
640+ then_pointer.push_back (" then" );
641+ const auto then_location{
642+ frame.traverse (sourcemeta::core::to_weak_pointer (then_pointer))};
643+ assert (then_location.has_value ());
644+
645+ auto else_pointer{sourcemeta::core::to_pointer (location.pointer )};
646+ else_pointer.push_back (" else" );
647+ const auto else_location{
648+ frame.traverse (sourcemeta::core::to_weak_pointer (else_pointer))};
649+ assert (else_location.has_value ());
650+
651+ return IRConditional{
652+ {.pointer = sourcemeta::core::to_pointer (location.pointer ),
653+ .symbol = symbol (frame, location)},
654+ {.pointer = std::move (if_pointer),
655+ .symbol = symbol (frame, if_location.value ().get ())},
656+ {.pointer = std::move (then_pointer),
657+ .symbol = symbol (frame, then_location.value ().get ())},
658+ {.pointer = std::move (else_pointer),
659+ .symbol = symbol (frame, else_location.value ().get ())}};
660+ }
661+
615662auto default_compiler (const sourcemeta::core::JSON &schema,
616663 const sourcemeta::core::SchemaFrame &frame,
617664 const sourcemeta::core::SchemaFrame::Location &location,
@@ -704,8 +751,8 @@ auto default_compiler(const sourcemeta::core::JSON &schema,
704751 return handle_ref (schema, frame, location, vocabularies, resolver,
705752 subschema);
706753 } else if (subschema.defines (" if" )) {
707- throw UnsupportedKeywordError (schema, location. pointer , " if " ,
708- " Unsupported keyword in subschema" );
754+ return handle_if_then_else (schema, frame, location, vocabularies, resolver ,
755+ subschema);
709756 } else if (subschema.defines (" not" )) {
710757 throw UnsupportedKeywordError (schema, location.pointer , " not" ,
711758 " Unsupported keyword in subschema" );
0 commit comments