summaryrefslogtreecommitdiff
path: root/src/setup.c
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2023-06-02 18:06:33 -0700
committerVito Caputo <vcaputo@pengaru.com>2023-06-03 07:42:02 -0700
commit401cfce3ebb205e46b4582fc6be1a0d42e213d31 (patch)
tree7e1c42852e2ccd8fc95802476f6eb9f4f9d11545 /src/setup.c
parent8dc099b955197c7100937d5fafc60c4b9681a5ab (diff)
til_settings,setup: introduce til_setting_spec_t.override()
In situations where modules wish to alias setting values like expanding "all" -> "mod0,mod1,mod2,mod3" they need a way to intercept the value-acceptance @ desc-assignment time in the front-end. This optional override() function does just that when present in the spec. The current setting's value is passed to the override, and if what's returned differs from what was passed (by pointer value), then the current value is freed and the override takes its place. The override function is expected to _always_ return non-NULL; either the value provided, or a newly allocated value override. The override function must never free the supplied value, that's the front-end's job in applying the override. The override() must return NULL on errors, which are assumed to be limited to ENOMEM failures.
Diffstat (limited to 'src/setup.c')
-rw-r--r--src/setup.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/setup.c b/src/setup.c
index d3c3e6d..dfeb4df 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -30,6 +30,22 @@ int setup_interactively(til_settings_t *settings, int (*setup_func)(const til_se
* validate its value against the description and assign the description if it passes.
*/
if (setting && !setting->desc) {
+ /* Apply override before, or after the spec_check()? unclear.
+ * TODO This probably also needs to move into a til_settings helper
+ */
+ if (desc->spec.override) {
+ const char *o;
+
+ o = desc->spec.override(setting->value);
+ if (!o)
+ return -ENOMEM;
+
+ if (o != setting->value) {
+ free((void *)setting->value);
+ setting->value = o;
+ }
+ }
+
r = til_setting_spec_check(&desc->spec, setting->value);
if (r < 0) {
*res_failed_desc = desc;
© All Rights Reserved