aboutsummaryrefslogtreecommitdiff
path: root/src/action.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-11-24 19:39:19 +0100
committerFederico Angelilli <code@fedang.net>2024-11-24 19:39:19 +0100
commitdef1e18d86579cf77649d1b8aa596d0877b822bb (patch)
tree0e6deebdef1575b4b74472bc4367b294f7551753 /src/action.c
parent76ad6b0d404d40f08b73d90ac5f66564c29feb95 (diff)
Refactor block_change_fn
Diffstat (limited to 'src/action.c')
-rw-r--r--src/action.c36
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);
}