diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2023-05-26 18:11:58 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2023-05-26 18:11:58 -0700 |
commit | 1a89d30e76d2bdb8268c17073d8a780b5adf3049 (patch) | |
tree | d567bfdf09c97bd05dc2e65df4f476ba438577a7 | |
parent | b9123bbb0b09cb0b30dd0a08f48caecfbb15f9c2 (diff) |
til_settings: add til_setting_spec_t.as_label
Currently settings instances get labels from three sources:
1. explicitly labeled by a root-level til_settings_new() call,
like main.c::til_settings_new(NULL, "video", args->video);
2. implicitly labeled in a spec.as_nested_settings w/spec.key
3. positionally labeled in a spec.as_nested_settings w/o spec.key
But when constructing setting/desc paths, using strictly these
settings instance labels as the "directory name path component"
equivalent, leaves something to be desired.
Take this hypothetical module setting path for example:
/module/layers/[0]/viscosity
Strictly using settings instance labels as-is, the above is what
you'd get for the drizzle::viscosity setting in something like:
--module=compose,layers=drizzle
Which is really awkward. What's really desired is more like:
/module/compose/layers/[0]/drizzle/viscosity
Now one way to achieve that is to just create more settings
instances to hold these module names as labels and things would
Just Work more or less.
But that would be rather annoying and heavyweight, when what's
_really_ wanted is a way to turn the first entry's value of a
given setting instance into a sort of synthetic directory
component in the path.
So that's what this commit does. When a spec has .as_label
specified, it's saying that path construction should treat this
setting's value as if it were a label on a settings instance.
But it's special cased to only apply to descs hanging off the
first entry of a settings instance, as that's the only scenario
we're making use of, and it avoids having to do crazy things like
search all the entries for specs w/.as_label set.
It feels a bit janky but it does achieve what's needed with
little pain/churn.
-rw-r--r-- | src/main.c | 3 | ||||
-rw-r--r-- | src/modules/checkers/checkers.c | 1 | ||||
-rw-r--r-- | src/modules/compose/compose.c | 3 | ||||
-rw-r--r-- | src/til.c | 3 | ||||
-rw-r--r-- | src/til_settings.c | 1 | ||||
-rw-r--r-- | src/til_settings.h | 1 |
6 files changed, 10 insertions, 2 deletions
@@ -105,7 +105,8 @@ static int setup_video(const til_settings_t *settings, til_setting_t **res_setti .regex = "[a-z]+", .preferred = DEFAULT_VIDEO, .values = values, - .annotations = NULL + .annotations = NULL, + .as_label = 1, }, res_desc); if (r < 0) diff --git a/src/modules/checkers/checkers.c b/src/modules/checkers/checkers.c index 6371665..f13727e 100644 --- a/src/modules/checkers/checkers.c +++ b/src/modules/checkers/checkers.c @@ -544,6 +544,7 @@ static int checkers_setup(const til_settings_t *settings, til_setting_t **res_se &(til_setting_spec_t){ .name = "Filled cell module name", .preferred = "none", + .as_label = 1, }, res_desc); if (r < 0) diff --git a/src/modules/compose/compose.c b/src/modules/compose/compose.c index 3e9ab2c..19f5867 100644 --- a/src/modules/compose/compose.c +++ b/src/modules/compose/compose.c @@ -375,6 +375,7 @@ static int compose_setup(const til_settings_t *settings, til_setting_t **res_set &(til_setting_spec_t){ .name = "Layer module name", .preferred = "none", + .as_label = 1, }, res_desc); if (r < 0) return r; @@ -402,6 +403,7 @@ static int compose_setup(const til_settings_t *settings, til_setting_t **res_set .annotations = NULL, .values = texture_values, .as_nested_settings = 1, + .as_label = 1, }, &texture, res_setting, @@ -421,6 +423,7 @@ static int compose_setup(const til_settings_t *settings, til_setting_t **res_set /* this is basically just to get the .as_label */ .name = "Texture module name", .preferred = "none", + .as_label = 1, }, res_desc); if (r < 0) @@ -294,7 +294,8 @@ int til_module_setup(const til_settings_t *settings, til_setting_t **res_setting .regex = "[a-zA-Z0-9]+", .preferred = DEFAULT_MODULE, .values = values, - .annotations = annotations + .annotations = annotations, + .as_label = 1 }, res_desc); if (r < 0) return r; diff --git a/src/til_settings.c b/src/til_settings.c index 0a1a3d5..e42aae8 100644 --- a/src/til_settings.c +++ b/src/til_settings.c @@ -405,6 +405,7 @@ int til_setting_desc_new(const til_settings_t *settings, const til_setting_spec_ d->spec.random = spec->random; d->spec.as_nested_settings = spec->as_nested_settings; + d->spec.as_label = spec->as_label; /* TODO: handle allocation errors above... */ *res_desc = d; diff --git a/src/til_settings.h b/src/til_settings.h index e86f06e..2e2afe9 100644 --- a/src/til_settings.h +++ b/src/til_settings.h @@ -17,6 +17,7 @@ typedef struct til_setting_spec_t { const char **annotations; /* if a set of values is provided, annotations for those values may be listed here */ char * (*random)(unsigned seed);/* if set, returns a valid random value for this setting */ unsigned as_nested_settings:1; /* if set, this setting expects a settings string for its value and wants a til_setting_t.value_as_nested_settings instance created for it */ + unsigned as_label:1; /* if set, this setting's value is to be used as a label component in path construction - only applies to the first setting entry in an instance (til_settings_t.entries[0]) */ } til_setting_spec_t; /* a setting_desc is a setting_spec that's been described to a specific containing settings instance via desc_new(), though desc_new() takes a const settings it's cast away when placed into the allocated desc. */ |