diff options
Diffstat (limited to 'src/action.c')
| -rw-r--r-- | src/action.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/action.c b/src/action.c index 0ae0c0a..65172f5 100644 --- a/src/action.c +++ b/src/action.c @@ -10,6 +10,7 @@ void action_perform(action_t *action, block_t *block, config_t *config) { block_t *target = block; bool warned = false; + bool notify = false; for (size_t i = 0; i < action->length; i++) { const char *key = action->parts[i].key; @@ -30,20 +31,39 @@ void action_perform(action_t *action, block_t *block, config_t *config) } } } + + if (notify && target->scheme->validate_change) { + assert(target->scheme->validate_fn != NULL); + int errors = target->scheme->validate_fn(target, config); + + if (config->action_failfast && errors) { + log_debug("Aborted action '%s' for %d errors", action->label, errors); + return; + } + } + + notify = false; warned = false; break; } case ACTION_SET_PAIR: { assert(target != NULL); + if (!warned && target->scheme->change_fn == NULL) { - log_warn("Block '%s' does not support changing values", target->label); + log_warn("Block '%s' does not support 'set' actions", target->label); warned = true; continue; } - // Skip "set-" - target->scheme->change_fn(target, config, key + 4, value); + // Skip "set-" in key + bool success = block_change(target, config, key + 4, value); + if (config->action_failfast && !success) { + log_debug("Aborted action '%s'", action->label); + return; + } + + notify = true; break; } @@ -63,6 +83,16 @@ void action_perform(action_t *action, block_t *block, config_t *config) "s:value", value); } + if (notify && target->scheme->validate_change) { + assert(target->scheme->validate_fn != NULL); + int errors = target->scheme->validate_fn(target, config); + + if (config->action_failfast && errors) { + log_debug("Aborted action '%s' for %d errors", action->label, errors); + return; + } + } + log_debug("Performed action '%s'", action->label); } |
