databoard 0.4.0

Provides a hierarchical key-value-store
Documentation
# databoard
Implementation of a hierarchical key-value-store with the possibility to do a remapping from a level up to its parent level.
</br>
It supports both `std` and `no_std` environments (requires `alloc`).

The following restrictions apply:
- Each level can have exactly one parent. 
- There is no remapping or access down the hierarchy.
- The remapping is evaluated recursively up the levels.

You can do the remapping either
- fully automatic,
- fully manual or 
- do an automatic remapping with manual overrides.

For controlling the access in the hierarchy there are two kinds of special keys:
- keys prefixed with an `@` redirect to the top level `databoard` of the hierarchy.
- keys prefixed with an `_` restrict the access to the current `databoard`.

## Usage

A standalone databoard:

```rust
use databoard::prelude::*;

// instantiation of a default Databoard
let mut databoard = Databoard::default();
// setting the value may fail, so it returns a `Result`,
let old = databoard.set("test", 42).unwrap();
// getting the value may fail, so it returns a `Result`,
let value = databoard.get::<i32>("test").unwrap();
// deleting the value returns a `Result` of the previous content.
let value = databoard.remove("test").unwrap();

```
Hierarchical usage:
```rust
use databoard::prelude::*;

let mut top_level = Databoard::default();
// this creates a databoard with automatic remapping to parent
let mut level1 = Databoard::with_parent(top_level.clone());
// some remapping rules
let mut remappings = RemappingList::default();
remappings.add("test".into(), "{test}".into());
remappings.add("other_test".into(), "{test}".into());
// this creates a databoard with manual remapping to parent using the defined remapping rules
let level2 = Databoard::with(Some(level1.clone()), Some(remappings), false);

// sets the value in the top `databoard`
top_level.set("test", 42).unwrap();
// but it can also be accessed from the two other levels
let value1: i32 = level1.get("test").unwrap();
let value2: i32 = level2.get("other_test").unwrap();
```

## License

Licensed with the fair use "NGMC" license, see [license file](https://codeberg.org/dibbots/behaviortree/src/branch/main/LICENSE)

## Contribution

Any contribution intentionally submitted for inclusion in the work by you,
shall be licensed with the same "NGMC" license, without any additional terms or conditions.