#toml-config #configuration #toml #proc-macro #macro-derive #macro #env-var

config-generator

A procedural macro for generating a configuration loader from an input struct

5 releases

0.1.3 Jan 22, 2024
0.1.2 Jan 21, 2024
0.1.1 Jan 21, 2024
0.1.0 Jan 21, 2024
0.0.1 Jan 21, 2024

#689 in Configuration

Custom license

10KB

Config Generator

A derive macro for generating boilerplate code for a configuration struct in rust.

Installation and usage

To install this crate, add it as a dependency:

cargo add config-generator

Additionally, the serde and toml crates are required to support loading from toml.

cargo add serde toml

To use, define a struct containing configuration variable that will be loaded by the generated code. env_key annotations define an environment variable key that will be used for loading the variable from the environment.

use config_generator::ConfigGenerator;

#[derive(ConfigGenerator, Default)]
struct Config {
  #[env_key = "NAME_ENV_KEY"]
  pub name: String,
  #[env_key = "THREAD_COUNT"]
  pub thread_count: u32,
  #[env_key = "ALLOWED_ORIGINS"]
  pub allowed_origins: Vec<String>,
  #[env_key = "ASSETS_PATH"]
  pub assets_path: Option<String>,
}

The resulting implementations will allow a config to be loaded from a toml file, the environment, or both, with loaded variables overwriting previously set ones. Note that you will need to implement a way to get some starting state for your config (probably either defining a new method or deriving Default as above).

// Loads a default config first from a toml file,
// then overlays environment variable values.
let config = Config::default()
  .with_toml("path/to/config.toml")
  .with_environment();

Features

By default, the load_toml feature is enabled, supplying a with_toml function implementation on the input struct, and consequently requiring the serde and toml crates. This feature can be disabled, and these crates removed, if the user so chooses.

Acknowledgements

This macro is inspired by a use-case for the optional_struct macro, which also doubles as a very useful resource for those wishing to learn about writing procedural macros in rust.

Dependencies

~240–690KB
~16K SLoC