| 623 | } |
| 624 | |
| 625 | Errata |
| 626 | Mod_query_filter::Case::pre_load(Config &cfg, YAML::Node cmp_node) |
| 627 | { |
| 628 | unsigned action_count = 0; |
| 629 | |
| 630 | if (!cmp_node.IsMap()) { |
| 631 | return Errata(S_ERROR, "List element at {} for {} modifier is not a comparison object.", cmp_node.Mark(), KEY); |
| 632 | } |
| 633 | |
| 634 | if (auto do_node = cmp_node[Global::DO_KEY]; do_node) { |
| 635 | return Errata(S_ERROR, R"("{}" at line {} is not allowed in a modifier comparison.)", Global::DO_KEY, do_node.Mark()); |
| 636 | } |
| 637 | |
| 638 | YAML::Node drop_node = cmp_node[ACTION_DROP]; |
| 639 | if (drop_node) { |
| 640 | _action = DROP; |
| 641 | cmp_node.remove(ACTION_DROP); |
| 642 | ++action_count; |
| 643 | } |
| 644 | |
| 645 | if (YAML::Node pass_node = cmp_node[ACTION_PASS]; pass_node) { |
| 646 | _action = PASS; |
| 647 | cmp_node.remove(ACTION_PASS); |
| 648 | ++action_count; |
| 649 | } |
| 650 | |
| 651 | if (YAML::Node replace_node = cmp_node[ACTION_REPLACE]; replace_node) { |
| 652 | Errata errata = this->parse_pair(cfg, replace_node, _replace); |
| 653 | if (!errata.is_ok()) { |
| 654 | errata.note("While parsing expression at {} for {} key in comparison at {}.", replace_node.Mark(), ACTION_REPLACE, |
| 655 | cmp_node.Mark()); |
| 656 | return errata; |
| 657 | } |
| 658 | _action = REPLACE; |
| 659 | cmp_node.remove(ACTION_REPLACE); |
| 660 | ++action_count; |
| 661 | } |
| 662 | |
| 663 | if (action_count > 1) { |
| 664 | return Errata(S_ERROR, "Only one of {}, {}, {} is allowed in the {} comparison at {}.", ACTION_REPLACE, ACTION_DROP, |
| 665 | ACTION_PASS, KEY, cmp_node.Mark()); |
| 666 | } |
| 667 | |
| 668 | YAML::Node opt_node = cmp_node[ACTION_OPT]; |
| 669 | if (opt_node) { |
| 670 | if (!opt_node.IsMap()) { |
| 671 | return Errata(S_ERROR, R"("Value for "{}" at {} for "{}" modifier is not an object.)", ACTION_OPT, opt_node.Mark(), KEY); |
| 672 | } |
| 673 | |
| 674 | if (YAML::Node vcmp_node = opt_node[OPT_VALUE]; vcmp_node) { |
| 675 | auto &&[vcmp, vcmp_errata]{Comparison::load(cfg, vcmp_node)}; |
| 676 | if (!vcmp_errata.is_ok()) { |
| 677 | return std::move(vcmp_errata.note(R"(While parsing "{}" option for "{}" modifier)", OPT_VALUE, KEY)); |
| 678 | } |
| 679 | _value_cmp = std::move(vcmp); |
| 680 | opt_node.remove(vcmp_node); |
| 681 | } |
| 682 | |