--- a/src/CLIParser.h Sat May 15 18:18:10 2021 +0200
+++ b/src/CLIParser.h Sun May 16 17:33:35 2021 +0200
@@ -52,8 +52,19 @@
else throw relpipe::cli::RelpipeCLIException(L"Unable to parse entity value: " + value + L" (expecting „relation“, „attribute“ or „value“)", relpipe::cli::CLI::EXIT_CODE_BAD_CLI_ARGUMENTS);
}
+ ENTITY parseModifyTarget(const relpipe::common::type::StringX& value) {
+ if (value == L"relation-name") return ENTITY::RELATION;
+ else if (value == L"attribute-name") return ENTITY::ATTRIBUTE;
+ else if (value == L"value") return ENTITY::VALUE;
+ else throw relpipe::cli::RelpipeCLIException(L"Unable to parse entity value: " + value + L" (expecting „relation-name“, „attribute-name“ or „value“)", relpipe::cli::CLI::EXIT_CODE_BAD_CLI_ARGUMENTS);
+ }
+
void addRule(RelationConfiguration& currentRelation, RewriteRule& currentRule) {
- if (currentRule.attribute.size()) {
+ if (currentRule.modify != ENTITY::DEFAULT) {
+ // the --value is optional → set defaults if missing:
+ if (currentRule.modify == ENTITY::RELATION && currentRule.value.size() == 0) currentRule.value = currentRelation.relation;
+ if (currentRule.modify == ENTITY::ATTRIBUTE && currentRule.value.size() == 0) currentRule.value = currentRule.attribute;
+
currentRule.attributePattern = currentRule.caseSensitive[ENTITY::ATTRIBUTE] ? std::wregex(currentRule.attribute) : std::wregex(currentRule.attribute, std::regex_constants::icase);
currentRule.valuePattern = currentRule.caseSensitive[ENTITY::VALUE] ? std::wregex(currentRule.value) : std::wregex(currentRule.value, std::regex_constants::icase);
currentRelation.rules.push_back(currentRule);
@@ -73,6 +84,7 @@
public:
static const relpipe::common::type::StringX OPTION_RELATION;
+ static const relpipe::common::type::StringX OPTION_MODIFY;
static const relpipe::common::type::StringX OPTION_ATTRIBUTE;
static const relpipe::common::type::StringX OPTION_VALUE;
static const relpipe::common::type::StringX OPTION_REPLACEMENT;
@@ -90,8 +102,17 @@
if (option == OPTION_RELATION) {
addRelation(c, currentRelation, currentRule); // previous relation
currentRelation.relation = readNext(arguments, i);
+ } else if (option == OPTION_MODIFY) {
+ addRule(currentRelation, currentRule); // previous rule
+ currentRule.modify = parseModifyTarget(readNext(arguments, i));
+ if (currentRule.modify == ENTITY::VALUE) currentRule.modify = ENTITY::DEFAULT;
} else if (option == OPTION_ATTRIBUTE) {
- addRule(currentRelation, currentRule); // previous rule
+ if (currentRule.modify == ENTITY::DEFAULT) {
+ currentRule.modify = ENTITY::VALUE;
+ } else if (currentRule.modify == ENTITY::VALUE) {
+ addRule(currentRelation, currentRule); // previous rule
+ currentRule.modify = ENTITY::VALUE;
+ }
currentRule.attribute = readNext(arguments, i);
} else if (option == OPTION_VALUE) {
currentRule.value = readNext(arguments, i);
@@ -100,13 +121,13 @@
} else if (option == OPTION_CASE_SENSITIVE) {
ENTITY entity = parseEntity(readNext(arguments, i));
bool value = parseBoolean(readNext(arguments, i));
- if (currentRule.attribute.size()) currentRule.caseSensitive[entity] = value;
- else currentRelation.caseSensitive[entity] = value;
+ if (currentRule.modify == ENTITY::DEFAULT) currentRelation.caseSensitive[entity] = value;
+ currentRule.caseSensitive[entity] = value;
} else if (option == OPTION_INVERT_MATCH) {
ENTITY entity = parseEntity(readNext(arguments, i));
bool value = parseBoolean(readNext(arguments, i));
- if (currentRule.attribute.size()) currentRule.invertMatch[entity] = value;
- else currentRelation.invertMatch[entity] = value;
+ if (currentRule.modify == ENTITY::DEFAULT) currentRelation.invertMatch[entity] = value;
+ currentRule.invertMatch[entity] = value;
} else throw relpipe::cli::RelpipeCLIException(L"Unsupported CLI option: " + option, relpipe::cli::CLI::EXIT_CODE_BAD_CLI_ARGUMENTS);
}
addRelation(c, currentRelation, currentRule); // last relation
@@ -119,6 +140,7 @@
};
const relpipe::common::type::StringX CLIParser::OPTION_RELATION = L"--relation";
+const relpipe::common::type::StringX CLIParser::OPTION_MODIFY = L"--modify";
const relpipe::common::type::StringX CLIParser::OPTION_ATTRIBUTE = L"--attribute";
const relpipe::common::type::StringX CLIParser::OPTION_VALUE = L"--value";
const relpipe::common::type::StringX CLIParser::OPTION_REPLACEMENT = L"--replacement";