Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/oppiliappan/fondant

macro based configuration management library
https://github.com/oppiliappan/fondant

Last synced: 2 months ago
JSON representation

macro based configuration management library

Awesome Lists containing this project

README

        

# fondant

[Documentation](https://docs.rs/fondant/) ·
[Architecture](#Architecture) · [Usage](#Usage) ·
[Customization](#Customization) · [Todo](#Todo)

`fondant` is a macro based library to take the boilerplate out of
configuration handling. All you need to do is derive the
`Configure` trait on your struct, and `fondant` will decide
where to store it and and how to do so safely.

Most of `fondant` is based off the `confy` crate,
with a couple of extra features:

- support for json, yaml and toml
- support for custom config paths
- support for custom config file names

### Usage ([Full Documentation](https://docs.rs/fondant/))

Drop this in your `Cargo.toml` to get started:

```
[dependencies]
fondant = "0.1.0"
```

Derive the macro:

```rust
// the struct has to derive Serialize, Deserialize and Default
use fondant::Configure;
use serde::{Serialize, Deserialize};

#[derive(Configure, Serialize, Deserialize, Default)]
#[config_file = "config.toml"]
struct AppConfig {
port: u32,
username: String,
}

fn main() {
// use `load` to load the config file
// loads in Default::default if it can't find one
let mut conf = AppConfig::load().unwrap();

// do stuff with conf
conf.port = 7878;

// call `store` to save changes
conf.store().unwrap();
}
```

Find more examples and options at [docs.rs](https://docs.rs/fondant/).

### Architecture

`fondant` is split into 3 separate crates:

- `fondant_deps`: external crates and utils that `fondant` requires
- `fondant_derive`: core macro definitions
- `fondant`: the user facing library that brings it all together

This slightly strange architecture arose because of some
limitations with proc-macro crates and strict cyclic
dependencies in cargo. All you need is the `fondant` crate.

### Todo

- [x] improve error types
- [ ] use `syn::Error` and `syn::Result` to report macro errors
- [x] write docs
- [ ] write test suite
- [x] bundle and publish to crates.io