figcon 0.2.2

A small stupid-simple synchronous serde_json config manager
Documentation
# figcon

[Documentation](https://docs.rs/figcon/latest/figcon/struct.FigCon.html)

A stupid-simple synchronous serde_json config file manager

I made this package for extremely basic json configuration for development or small applications, optimizing for simplicity/functionality over performance or quality. Feel free to never use this crate if you so please.

It is by no means a proper or efficient config manager, nor a database.

Key/Value pairs work fine with any `serde_json::Value` type.

If you wish to make object trees or categories, this library extends the Value implementation to allow some primitive object tree manipulation. See the examples below.

## Use Example

```rust
use std::{env, path::Path};
use figcon::{FigCon, ValueExtensions};
use serde_json::json;

fn main() {
    // Example setup using config.json stored adjacent to the program binary
    let mut conf = FigCon::load_or_default(
        Path::join(env::current_dir().unwrap().as_path(), "config.json")
    );

    // Set keys in the config
    conf.set_key_st("Static String Key", json!("Static Value Type"));
    conf.set_key("Dynamic String Key".to_owned(), json!(1234));

    // Get keys in the config
    conf.get_key_st("Static String Key");
    // Outputs: Value::String("Static Value Type")
    conf.get_key("Dynamic String Key".to_owned());
    // Outputs: Value::Number(1234)

    // Check if a key exists
    conf.has_key_st("Another String");
    // Ouputs: true

    // Delete keys in the config
    conf.remove_key_st("Another String");
    // Config no longer stores that key/value pair

    // Check if a key exists after a change
    conf.has_key_st("Another String");
    // Ouputs: false

    // Create a new child in the main
    let parent = conf.new_obj_st("Subtree One"); // Live config new objects are always valid. No option handling
    let child = parent.new_obj_st("child").unwrap();
    child.set_key_st("Child's parameter", json!(1234));
    let subchild = child.new_obj_st("Child's Subtree").unwrap();
    subchild.set_key_st("Subchild's parameter", json!("hello world!"));

    // Acquire a reference to a subtree
    let nsub = conf.get_obj_st("Subtree One").unwrap();
    // Outputs: <Child's Subtree> (Value)
    nsub.has_key_st("Child's parameter");
    // Outputs: true

    // Synchronous write to file
    conf.save();
}
```

Output of the example above (./config.json)

```json
{
    "Dynamic String Key": 1234,
    "Static String Key": "Static Value Type",
    "Subtree One": {
        "child": {
            "Child's Subtree": {
                "Subchild's parameter": "hello world!"
            },
            "Child's parameter": 1234
        }
    }
}
```