#settings #environment #configuration #env-var

scuffle-settings

Tools for managing configuration from environment variables or config files

4 releases

new 0.1.0 Feb 10, 2025
0.0.3 Feb 10, 2025
0.0.2 Dec 8, 2024
0.0.1 Dec 1, 2024
0.0.0 Nov 28, 2024

#390 in Configuration

46 downloads per month
Used in scuffle-image-processor

MIT/Apache

29KB
438 lines

scuffle-settings

[!WARNING]
This crate is under active development and may not be stable.

crates.io docs.rs


A crate designed to provide a simple interface to load and manage settings for Scuffle.

Why do we need this?

TODO(troy): Add more details about why we need this.

Status

This crate is currently under development and is not yet stable.

Unit tests are not yet fully implemented. Use at your own risk.

License

This project is licensed under the MIT or Apache-2.0 license. You can choose between one of them if you use this work.

SPDX-License-Identifier: MIT OR Apache-2.0


lib.rs:

A crate designed to provide a simple interface to load and manage settings.

This crate is a wrapper around the config crate and clap crate to provide a simple interface to load and manage settings.

How to use this

With scuffle_bootstrap

// Define a config struct like this
// You can use all of the serde attributes to customize the deserialization
#[derive(serde::Deserialize)]
struct MyConfig {
    some_setting: String,
    #[serde(default)]
    some_other_setting: i32,
}

// Implement scuffle_boostrap::ConfigParser for the config struct like this
scuffle_settings::bootstrap!(MyConfig);

/// Our global state
struct Global;

impl scuffle_bootstrap::global::Global for Global {
    type Config = MyConfig;

    async fn init(config: MyConfig) -> anyhow::Result<Arc<Self>> {
        // Here you now have access to the config
        Ok(Arc::new(Self))
    }
}

Without scuffle_bootstrap

// Define a config struct like this
// You can use all of the serde attributes to customize the deserialization
#[derive(serde::Deserialize)]
struct MyConfig {
    some_setting: String,
    #[serde(default)]
    some_other_setting: i32,
}

// Parsing options
let options = scuffle_settings::Options {
    env_prefix: Some("MY_APP"),
    ..Default::default()
};
// Parse the settings
let settings: MyConfig = scuffle_settings::parse_settings(options)?;

See Options for more information on how to customize parsing.

Templates

If the templates feature is enabled, the parser will attempt to render the configuration file as a jinja template before processing it.

All environment variables set during execution will be available under the env variable inside the file.

Example TOML file:

some_setting = "${{ env.MY_APP_SECRET }}"

Use ${{ and }} for variables, {% and %} for blocks and {# and #} for comments.

Command Line Interface

The following options are available for the CLI:

  • --config or -c

    Path to a configuration file. This option can be used multiple times to load multiple files.

  • --override or -o

    Provide an override for a configuration value, in the format KEY=VALUE.

Feature Flags

Format Feature Flags

  • toml: Enables TOML support
  • yaml: Enables YAML support
  • json: Enables JSON support
  • json5: Enables JSON5 support
  • ron: Enables RON support
  • ini: Enables INI support

Status

This crate is currently under development and is not yet stable.

Unit tests are not yet fully implemented. Use at your own risk.

License

This project is licensed under the MIT or Apache-2.0 license. You can choose between one of them if you use this work.

SPDX-License-Identifier: MIT OR Apache-2.0

Dependencies

~1.3–9MB
~90K SLoC