Elektra  0.9.5
Plugin: conditionals

This plugin uses if-then-else like conditions. It also works as global plugin.

Stored in the metakey check/condition to validate data is:

(IF-condition) ? (THEN-condition) : (ELSE-condition) where the ELSE-condition is optional

Condition: Key Operation `('String' | '1234.56' | Key | '')`

Operations: !=, ==, <, <=, =>, >, :=, where:

(! a/key) evaluates to true if the key a/key doesn't exist, to false if it exists.

(IF-condition) ? ('ThenValue') : ('ElseValue')

Depending on if the condition is met, either 'ThenValue' or 'ElseValue' will be assigned as key value if the metakey assign/condition is used.

Multiple conditions can be nested and combined using parentheses and && (logical AND) or || (logical OR). Additional parentheses must be used to form valid conditions again. ( (condition 1) && (condition 2) )

The condition/validsuffix can be used to define a list of valid suffixes to numeric values. If two operants have the same valid suffix or one of them no suffix they will be treated by their numeric value ignoring their suffix. `condition/validsuffix = 'm', 'cm', 'km'would treat2.3mjust as the numeric value2.3` when comparing to another value having the same or no suffix.

Keynames are all either relative to to-be-tested key (starting with ./ or ../), relative to the parentkey (starting with @/) or absolute (e.g. system:/key).

It's also possible to test multiple conditions using check/condition/{any,all,none} as a meta array. Where any means that at least one statement has to evaluate to true, all that all statements have to evaluate to true, and none that no statement is allowed to evaluate to false (default). For multiple assign statements use assign/condition as a meta array. The first assign/condition/# statement that evaluates to true will be assigned and the rest ignored.

(this/key != 'value') ? (then/key == some/other/key) : (or/key <= '125')

Meaning: IF this/key NOT EQUAL TO 'value' THEN then/key MUST EQUAL some/other/key ELSE or/key MUST BE LESS THAN 125

Another full example:

#Backup-and-Restore:user:/tests/conditionals
sudo kdb mount conditionals.dump user:/tests/conditionals conditionals dump
kdb set user:/tests/conditionals/fkey 3.0
kdb set user:/tests/conditionals/hkey hello
# will succeed
kdb meta-set user:/tests/conditionals/key check/condition "(../hkey == 'hello') ? (../fkey == '3.0')"
# will fail
kdb meta-set user:/tests/conditionals/key check/condition "(../hkey == 'hello') ? (../fkey == '5.0')"
# RET:5
# ERROR:C03200

Assignment example:

kdb set user:/tests/conditionals/hkey Hello
kdb meta-set user:/tests/conditionals/hkey assign/condition "(./ == 'Hello') ? ('World')"
# alternative syntax: "(../hkey == 'Hello') ? ('World')
kdb get user:/tests/conditionals/hkey
#> World
# cleanup
kdb rm -r user:/tests/conditionals
sudo kdb umount user:/tests/conditionals

Global plugin example:

```

Backup old list of global plugins

kdb set user:/tests/msr kdb export system:/elektra/globalplugins > $(kdb get user:/tests/msr)

sudo kdb mount main.ini /tests/conditionals ni sudo kdb mount sub.ini /tests/conditionals/sub ni

mount conditionals as global plugin

sudo kdb global-mount conditionals || $(exit 0)

create testfiles

echo 'key1=val1' > kdb file /tests/conditionals echo '[key1]' >> kdb file /tests/conditionals echo "check/condition=(./ == 'val1') ? (../sub/key == 'true')" >> kdb file /tests/conditionals

echo "key=false" > kdb file /tests/conditionals/sub

should fail and yield an error

kdb export /tests/conditionals ni

ERROR:C03200

Sorry, module conditionals issued the error C03200:

Validation failed: Validation of Key key1: (./ == 'val1') ? (../sub/key == 'true') failed. ((../sub/key == 'true') failed)

kdb set /tests/conditionals/sub/key true

should succeed

kdb export /tests/conditionals ni

cleanup

kdb rm -r /tests/conditionals sudo kdb umount /tests/conditionals/sub sudo kdb umount /tests/conditionals

sudo kdb global-umount conditionals

kdb rm -r system:/elektra/globalplugins kdb import system:/elektra/globalplugins < $(kdb get user:/tests/msr) rm $(kdb get user:/tests/msr) kdb rm user:/tests/msr ```