`fast_config` ============= --- [github](https://github.com/FlooferLand/fast_config) [crates.io](https://crates.io/crates/fast_config) [docs.rs](https://docs.rs/fast_config)
[license](https://github.com/FlooferLand/fast_config/blob/main/LICENSE) [code size](https://www.youtube.com/watch?v=dQw4w9WgXcQ) [issues](https://github.com/FlooferLand/fast_config/issues) ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/FlooferLand/fast_config/main_test.yml) A small, safe, lightweight, and easy-to-use Rust crate to read and write to config files. Currently only supports: [JSON](https://crates.io/crates/serde_json) & [JSON5](https://crates.io/crates/json5), [TOML](https://crates.io/crates/toml), and [YAML](https://crates.io/crates/serde_yml). But more [Serde](https://serde.rs/)-supported formats *(such as RON)* are planned to be added later. ### Useful teleports: - *[Migrating to a newer version of the crate](https://github.com/FlooferLand/fast_config/blob/main/CONVERSION_TUTORIAL.md)* - *[Code examples](#examples)* - *[Getting Started](#getting-started)* - *[Things that need work (for contributors!)](./CONTRIBUTORS.md)* ## What is this crate? `fast_config` was made to be a faster to set up, more light-weight, statically typed alternative to [config](https://crates.io/crates/config). It also manages to have its own benefits compared to some other config-reading crates as there is full support for writing/saving config files, and it also provides you with *some* options regarding styling your config files --- ### Why this crate? - It's small and fast *(uses compile-time features to remove/add code)* - It's safe and robust *(uses Rust's structs to store data, instead of HashMaps)* - Ridiculously simple to use *(only takes 3 lines of short code to make a config file, write/read something, and save it)* ### Why not this crate? 1. It doesn't work if you don't know the way your data will be formatted *(for example if you want your users to be able to have any keys ranging from `key0` to `key9000` in an object)* 2. It cannot currently understand the RON file format 3. It cannot currently save comments in config files. --- **2** and **3** _are_ going to be addressed with future updates, however. ### ⚠ Documentation and tests are still being made! ⚠ This crate is now stable, I however haven't battle-tested this in any humongous projects, so while there will NOT be any panics or crashes, some weird things might happen at scale. Documentation might be a little weird or incomplete at the current moment, too. Feel free to contribute any fixes by [opening up an issue](https://github.com/FlooferLand/fast_config/issues) if you find anything that isn't working as expected! --- ## Examples: ```rust,ignore use fast_config::Config; use serde::{Serialize, Deserialize}; // Creating a config struct to store our data #[derive(Serialize, Deserialize)] pub struct MyData { pub student_debt: i32 } fn main() { // Initializing a logging system (needed to show some warnings/errors) env_logger::init(); // Creating our data (default values) let data = MyData { student_debt: 20 }; // Creating a new config struct with our data struct let mut config = Config::new("./config/myconfig.json5", data).unwrap(); // Read/writing to the data println!("I am ${} in debt", config.data.student_debt); config.data.student_debt = i32::MAX; println!("Oh no, i am now ${} in debt!!", config.data.student_debt); // Saving it back to the disk config.save().unwrap(); } ``` ## Getting started 1. Add the crate to your project via
`cargo add fast_config` - Additionally, also add `serde` as it is required! --- 2. Enable the feature(s) for the format(s) you'd like to use
- Currently only `json5`, `toml`, and `yaml` are supported
--- 3. Create a struct to hold your data that derives `Serialize` and `Deserialize` --- 4. Create an instance of your data struct - Optionally `use` the crate's `Config` type for convenience
`use fast_config::Config;` --- 5. Use
```rust,ignore let my_config = Config::new("./path/to/my_config_file", your_data).unwrap(); ``` to create and store your config file(s)! Alternatively you could also use `Config::from_settings` to style some things and manually set the format! --- View the [examples](./examples) directory for more advanced examples. ## NOTE: This project will be rewritten sometime The code is currently very messy, but I'm too busy with other projects to deal with it.
I've improved a lot as a Rust developer since the creation of this project and a lot of the ways you interface with it could be better. Some things I want to do for the rewrite are listed in a comment at the top of [lib.rs](./src/lib.rs) Some other ideas I'll have to experiment with: - Moving to a trait-based approach where you can slap a `#[derive(FastConfig)]` onto any struct to give it the `save`/`load` functions. This makes the annoying `my_config.data.my_setting` into simply `my_config.my_setting` A conversion guide for the rewrite will be available, as I'll have to convert over my projects as well to use the rewritten `fast_config`. The rewrite should be smaller, safer, and the source code will most importantly be ***way more readable***. ---