#struct #helper #file #configuration #error #configuraiton #loading-saving

configurable

simple helpers for loading/saving a struct to file in $XDG

3 releases

0.3.5 Mar 31, 2020
0.3.4 May 8, 2019
0.3.3 May 8, 2019

#1649 in Encoding

34 downloads per month

0BSD license

17KB
124 lines

configurable

Crates.io doc.rs CircleCI Crates.io

This crate provides a set of functions for loading/saving structs to toml files in OS-accurate locations

A normal configuration (e.g. saving something to a toml file in CONFIG_DIR)

use configurable::{Configurable, Config, Data, Error, LoadState};
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct MyConfiguration {
    name: String,
    attempts: u32,
    force: bool,
}

impl Default for MyConfiguration {
    fn default() -> Self {
        Self {
            name: "Foobar".into(),
            attempts: 3,
            force: false,
        }
    }
}

impl Config for MyConfiguration {}

impl Configurable for MyConfiguration {
    const ORGANIZATION: &'static str = "museun";
    const APPLICATION: &'static str = "foobar";
    const NAME: &'static str = "config.toml";

    fn ensure_dir() -> Result<std::path::PathBuf, Error> {
        <Self as Config>::ensure_dir()
    }
}

A 'data' configuration (e.g. saving something to a json file in the DATA_DIR)

use configurable::{Configurable, Config, Data, Error, LoadState};
use serde::{Serialize, Deserialize};
#[derive(Default, Serialize, Deserialize)]
struct MyData {
    #[serde(flatten)]
    data: std::collections::HashMap<String, String>
}


impl Data for MyData {}

impl Configurable for MyData {
    const ORGANIZATION: &'static str = "museun";
    const APPLICATION: &'static str = "foobar";
    const NAME: &'static str = "data.json";

    fn ensure_dir() -> Result<std::path::PathBuf, Error> {
        <Self as Data>::ensure_dir()
    }
}

Loading the data

fn load_my_stuff() -> Something {
    use configurable::Configuable;
    // this tries to load the configuration ot creates a default instance of it
    match match Something::load_or_default() {
        Ok(data) => data,
        Err(err) => {
            eprintln!("cannot load configuration: {}", err);
            std::process::exit(1)
        }
    } {
        // it was successfully loaded
        configurable::LoadState::Loaded(this) => this,
        // it was defaulted
        configurable::LoadState::Default(this) => {
            eprintln!(
                "a default configuration was created at: {}",
                Something::path().unwrap().display()
            );
            std::process::exit(1)
        }
    }
}

Dependencies

~1.5–2.5MB
~46K SLoC