|
Elektra
0.8.20
|
The YAML CPP plugin reads and writes configuration data via the yaml-cpp library.
You can mount this plugin via kdb mount:
``` sudo kdb mount config.yaml /examples/yamlcpp yamlcpp ```
. To unmount the plugin use kdb umount:
``` sudo kdb umount /examples/yamlcpp ```
. The following examples show how you can store and retrieve data via yamlcpp.
`` <h1>Mount yamlcpp plugin to cascading namespace/examples/yamlcpp` sudo kdb mount config.yaml /examples/yamlcpp yamlcpp
echo "π : π³" > kdb file /examples/yamlcpp
kdb get /examples/yamlcpp/π #> π³
echo "some key: @some value" >> kdb file /examples/yamlcpp kdb get "/examples/yamlcpp/some key"
echo "π: value" > kdb file /examples/yamlcpp
kdb setkdb set /examples/yamlcpp/fleetwood mac kdb set /examples/yamlcpp/the chain
kdb get /examples/yamlcpp/the #> chain kdb get /examples/yamlcpp/fleetwood #> mac
kdb rm -r /examples/yamlcpp sudo kdb umount /examples/yamlcpp ```
YAML CPP provides basic support for Elektraβs array data type.
`` <h1>Mount yamlcpp plugin to cascading namespace/examples/yamlcpp` sudo kdb mount config.yaml /examples/yamlcpp yamlcpp
echo 'sunny:' > kdb file /examples/yamlcpp echo ' - Charlie' >> kdb file /examples/yamlcpp echo ' - Dee' >> kdb file /examples/yamlcpp
kdb ls /examples/yamlcpp #> user/examples/yamlcpp/sunny #> user/examples/yamlcpp/sunny/#0 #> user/examples/yamlcpp/sunny/#1
kdb get user/examples/yamlcpp/sunny/#1 #> Dee
arraykdb getmeta /examples/yamlcpp/sunny array
kdb set user/examples/yamlcpp/sunny/#2 Dennis kdb set user/examples/yamlcpp/sunny/#3 Frank kdb set user/examples/yamlcpp/sunny/#4 Mac
kdb get user/examples/yamlcpp/sunny/$(kdb getmeta user/examples/yamlcpp/sunny array) #> Mac
kdb rm -r /examples/yamlcpp sudo kdb umount /examples/yamlcpp ```
The plugin also supports nested arrays.
`` <h1>Mount yamlcpp plugin to cascading namespace/examples/yamlcpp` sudo kdb mount config.yaml /examples/yamlcpp yamlcpp
kdb set /examples/yamlcpp/key value kdb set /examples/yamlcpp/array/#0 scalar kdb set /examples/yamlcpp/array/#1/key value kdb set /examples/yamlcpp/array/#1/π π
kdb ls /examples/yamlcpp #> user/examples/yamlcpp/array #> user/examples/yamlcpp/array/#0 #> user/examples/yamlcpp/array/#1 #> user/examples/yamlcpp/array/#1/key #> user/examples/yamlcpp/array/#1/π #> user/examples/yamlcpp/key
kdb get /examples/yamlcpp/array/#1/key #> value
echo "/examples/yamlcpp/array: β`kdb get /examples/yamlcpp/array`β" #> /examples/yamlcpp/array: ββ kdb get /examples/yamlcpp/array/#1 echo "/examples/yamlcpp/array/#1: β`kdb get /examples/yamlcpp/array/#1`β" #> /examples/yamlcpp/array/#1: ββ
kdb rm /examples/yamlcpp/array/#1/key
kdb ls /examples/yamlcpp #> user/examples/yamlcpp/array #> user/examples/yamlcpp/array/#0 #> user/examples/yamlcpp/array/#1 #> user/examples/yamlcpp/array/#1/π #> user/examples/yamlcpp/key
key or array could be the βfirstβ key -key before we retrieve the data. This waykdb rm /examples/yamlcpp/key kdb file /examples/yamlcpp | xargs cat #> array: #> - scalar #> - π: π
kdb rm -r /examples/yamlcpp sudo kdb umount /examples/yamlcpp ```
The plugin supports metadata. The example below shows how a basic Key including some metadata, looks inside the YAML configuration file:
```yaml key without metadata: value key with metadata: !elektra/meta
. As we can see above the value containing metadata is marked by the tag handle !elektra/meta. The data type contains a list with two elements. The first element of this list specifies the value of the key, while the second element contains a map saving the metadata for the key. The data above represents the following key set in Elektra if we mount the file directly to the namespace user:
| Name | Value | Metaname | Metavalue |
|---|---|---|---|
| user/key without metadata | value1 | β | β |
| user/key with metadata | value2 | metakey | metavalue |
| empty metakey | β | ||
| another metakey | another metavalue |
. The example below shows how we can read and write metadata using the yamlcpp plugin via kdb.
`` <h1>Mount yamlcpp plugin to cascading namespace/examples/yamlcpp` sudo kdb mount config.yaml /examples/yamlcpp yamlcpp
echo "π: !elektra/meta [π¦, {comment: Unicorn}]" > kdb file /examples/yamlcpp kdb lsmeta /examples/yamlcpp/π #> comment kdb getmeta /examples/yamlcpp/π comment #> Unicorn
kdb set /examples/yamlcpp/brand new kdb setmeta /examples/yamlcpp/brand comment "The Devil And God Are Raging Inside Me" kdb setmeta /examples/yamlcpp/brand rationale "Because I Love It"
kdb lsmeta /examples/yamlcpp/brand #> comment #> rationale kdb getmeta /examples/yamlcpp/brand rationale #> Because I Love It
kdb rm -r /examples/yamlcpp sudo kdb umount /examples/yamlcpp ```
We can also invoke additional plugins that use metadata like type.
``` sudo kdb mount config.yaml /examples/yamlcpp yamlcpp type kdb set /examples/yamlcpp/typetest/number 21 kdb setmeta /examples/yamlcpp/typetest/number check/type short
kdb set /examples/yamlcpp/typetest/number "One"
kdb get /examples/yamlcpp/typetest/number #> 21
kdb rm -r /examples/yamlcpp sudo kdb umount /examples/yamlcpp ```
YAML CPP also supports base64 encoded data via the Base64 plugin.
`` <h1>Mount YAML CPP plugin at cascading namespace/examples/binary` sudo kdb mount test.yaml /examples/binary yamlcpp
echo 'bin: !!binary aGk=' > kdb file /examples/binary
aGk= to hi and stores the value in binary form.kdb get prints the data as hexadecimal byte values.kdb get /examples/binary/bin #>
ruby to convert the hexadecimal value returned by kdb getbash or fish as shell thenkdb get /examples/binary/bin # Bashruby -e "print ARGV[0].split('\x')[1..-1].map {|byte| byte.to_i(16).chr }.join" kdb get /examples/binary/bin #> hi
kdb set /examples/binary/text mate
kdb get /examples/binary/text #> mate
aGk= even after YAML CPP wrote a new configuration.grep -q 'bin: !.* aGk=' kdb file user/examples/binary
kdb rm -r /examples/binary sudo kdb umount /examples/binary ```
This plugin requires yaml-cpp. On a Debian based OS the package for the library is called libyaml-cpp-dev . On macOS you can install the package yaml-cpp via HomeBrew.
One of the limitations of this plugin is, that it only supports values inside leaf nodes. Let us look at an example to show what that means. The YAML file below:
```yaml root: subtree: π below root: leaf level 1: level 2: level 3: π ```
stores all of the values (π, leaf and π) in the leaves of the mapping. The drawing below makes this situation a little bit clearer.
The key set that this plugin creates using the data above looks like this (assuming we mount the plugin to user/examples/yamlcpp):
| Name | Value |
|---|---|
| user/examples/yamlcpp/level | |
| user/examples/yamlcpp/level 1/level 2 | |
| user/examples/yamlcpp/level 1/level 2/level 3 | π |
| user/examples/yamlcpp/root | |
| user/examples/yamlcpp/root/below root | leaf |
| user/examples/yamlcpp/root/subtree | π |
. Now why is this plugin unable to store values outside leaf nodes? For example, why can we not store a value inside user/examples/yamlcpp/level 1/level 2? To answer this question we need to look at the YAML representation:
```yaml level 1: level 2: level 3: π ```
. In a naive approach we might just try to add a value e.g. π right next to level 2:
```yaml level 1: level 2: π level 3: π ```
. This however would be not correct, since then the YAML node level 2 would contain both a scalar value (π) and a mapping ({ level 3: π }). We could solve this dilemma using a list:
```yaml level 1: level 2:
. However, if we use this approach we are not able to support Elektraβs array type properly.
tag:yaml.org,2002:binary (shorthand: !!binary).
1.8.8