SuperConfig

Struct SuperConfig 

Source
pub struct SuperConfig { /* private fields */ }
Expand description

SuperConfig is a universal configuration management platform that combines advanced features with 100% Figment compatibility.

Built on Figment’s solid foundation, SuperConfig adds production-ready capabilities including hierarchical configuration cascades, advanced array merging, intelligent format detection, verbosity debugging, and performance optimizations - while maintaining seamless compatibility with existing Figment code.

§Core Features

  • Hierarchical Configuration: Git-like config inheritance across system → user → project levels
  • Advanced Array Merging: Compose configurations with _add/_remove patterns
  • Intelligent Format Detection: Content-based parsing with caching and fallback strategies
  • Verbosity System: CLI-style debugging with -v, -vv, -vvv levels for troubleshooting
  • Performance Optimized: Lazy loading, caching, and optimized data structures

§Quick Start Example

use superconfig::{SuperConfig, VerbosityLevel};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Default)]
struct AppConfig {
    database_url: String,
    log_level: String,
    port: u16,
}

// Basic configuration loading
let config: AppConfig = SuperConfig::new()
    .with_defaults(AppConfig::default())
    .with_file("config.toml")
    .with_env("APP_")
    .extract()?;

§Verbosity for Debugging

Enable verbosity to debug configuration loading issues:

use superconfig::{SuperConfig, VerbosityLevel};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Default)]
struct Config {
    host: String,
    port: u16,
}

// Enable debug verbosity (equivalent to -vv in CLI)
let config: Config = SuperConfig::new()
    .with_verbosity(VerbosityLevel::Debug)  // Shows detailed loading steps
    .with_hierarchical_config("myapp")
    .with_env("APP_")
    .extract()?;

§CLI Integration Example

Integrate verbosity with CLI argument parsing:

use superconfig::{SuperConfig, VerbosityLevel};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Default)]
struct Config {
    host: String,
    port: u16,
}

// Parse CLI verbosity (normally from clap, structopt, etc.)
fn parse_verbosity() -> u8 {
    std::env::args()
        .skip(1)
        .filter(|arg| arg.starts_with("-v"))
        .map(|arg| arg.matches('v').count() as u8)
        .max()
        .unwrap_or(0)
}

let verbosity = VerbosityLevel::from_cli_args(parse_verbosity());

let config: Config = SuperConfig::new()
    .with_verbosity(verbosity)  // Respects -v, -vv, -vvv from command line
    .with_defaults(Config::default())
    .with_hierarchical_config("myapp")
    .with_env("APP_")
    .extract()?;

§Advanced Features

§Array Merging

// config/base.toml
// features = ["auth", "logging"]

// config/production.toml
// features_add = ["metrics", "tracing"]
// features_remove = ["logging"]

// Result: features = ["auth", "metrics", "tracing"]
let config = SuperConfig::new()
    .with_file("config/base.toml")
    .with_file("config/production.toml");

§Debug Message Collection

use superconfig::{SuperConfig, VerbosityLevel};

let config = SuperConfig::new()
    .with_verbosity(VerbosityLevel::Debug)
    .with_file("config.toml");

// Access debug messages programmatically
let debug_messages = config.debug_messages();
for msg in debug_messages {
    println!("{}: {}", msg.provider, msg.message);
}

§Universal Platform Vision

SuperConfig is designed to become the universal configuration standard across popular languages through WebAssembly bindings, REST APIs, and protocol standardization.

Implementations§

Source§

impl SuperConfig

Source

pub fn as_json(&self) -> Result<String, Error>

Export configuration as pretty-formatted JSON string

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String }

let config = SuperConfig::new()
    .with_defaults(Config { name: "test".to_string() });
     
let json_str = config.as_json()?;
println!("{}", json_str); // Pretty-printed JSON
Source

pub fn as_yaml(&self) -> Result<String, Error>

Export configuration as YAML string

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String }

let config = SuperConfig::new()
    .with_defaults(Config { name: "test".to_string() });
     
let yaml_str = config.as_yaml()?;
println!("{}", yaml_str);
Source

pub fn as_toml(&self) -> Result<String, Error>

Export configuration as TOML string

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String }

let config = SuperConfig::new()
    .with_defaults(Config { name: "test".to_string() });
     
let toml_str = config.as_toml()?;
println!("{}", toml_str);
Source

pub fn get_string<K: AsRef<str>>(&self, key: K) -> Result<String, Error>

Get a string value from configuration

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { database: Database }

#[derive(Serialize)]
struct Database { host: String }

let config = SuperConfig::new()
    .with_defaults(Config {
        database: Database { host: "localhost".to_string() }
    });
     
let host = config.get_string("database.host")?;
println!("Database host: {}", host);
Source

pub fn get_array<T>(&self, key: &str) -> Result<Vec<T>, Error>

Get an array value from configuration

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { cors: Cors }

#[derive(Serialize)]
struct Cors { allowed_origins: Vec<String> }

let config = SuperConfig::new()
    .with_defaults(Config {
        cors: Cors { allowed_origins: vec!["https://example.com".to_string()] }
    });
     
let origins = config.get_array::<String>("cors.allowed_origins")?;
println!("CORS origins: {:?}", origins);
Source

pub fn has_key(&self, key: &str) -> Result<bool, Error>

Check if a configuration key exists

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { redis: Redis }

#[derive(Serialize)]
struct Redis { enabled: bool }

let config = SuperConfig::new()
    .with_defaults(Config {
        redis: Redis { enabled: true }
    });
     
if config.has_key("redis.enabled")? {
    println!("Redis is configured");
}
Source

pub fn keys(&self) -> Result<Vec<String>, Error>

Get all top-level configuration keys

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { database: String, redis: String }

let config = SuperConfig::new()
    .with_defaults(Config {
        database: "postgres://localhost".to_string(),
        redis: "redis://localhost".to_string()
    });
     
let keys = config.keys()?;
println!("Config sections: {:?}", keys);
Source

pub fn debug_config(&self) -> Result<String, Error>

Debug configuration with pretty-printed values and source information

Returns a formatted string showing the final configuration values along with metadata about which providers contributed each value.

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String }

let config = SuperConfig::new()
    .with_defaults(Config { name: "test".to_string() });
     
println!("{}", config.debug_config()?);
// Output shows merged config with provider information
Source

pub fn debug_sources(&self) -> Vec<Metadata>

Get debug information about configuration sources

Returns metadata about the providers that contributed to the configuration.

§Examples
use superconfig::SuperConfig;
use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String }

let config = SuperConfig::new()
    .with_defaults(Config { name: "test".to_string() });
     
let sources = config.debug_sources();
println!("Configuration sources: {:#?}", sources);
Source§

impl SuperConfig

Source

pub fn with_verbosity(self, level: VerbosityLevel) -> Self

Set the verbosity level for configuration debugging

Controls the amount of debug information displayed during configuration loading. Higher levels include all information from lower levels.

§Examples
use superconfig::{SuperConfig, VerbosityLevel};

let config = SuperConfig::new()
    .with_verbosity(VerbosityLevel::Debug)  // -vv level debugging
    .with_file("config.toml");
Source

pub fn with_info_verbosity(self) -> Self

Enable basic configuration loading progress (equivalent to -v)

Shows which providers are being loaded and final success/failure.

§Examples
use superconfig::SuperConfig;

let config = SuperConfig::new()
    .with_info_verbosity()  // -v level
    .with_file("config.toml");
Source

pub fn with_debug_verbosity(self) -> Self

Enable detailed step-by-step information (equivalent to -vv)

Shows file discovery, individual provider results, and merge operations.

§Examples
use superconfig::SuperConfig;

let config = SuperConfig::new()
    .with_debug_verbosity()  // -vv level
    .with_hierarchical_config("myapp");
Source

pub fn with_trace_verbosity(self) -> Self

Enable full introspection with configuration values (equivalent to -vvv)

Shows actual configuration values at each step and final merged result.

§Examples
use superconfig::SuperConfig;

let config = SuperConfig::new()
    .with_trace_verbosity()  // -vvv level
    .with_env("APP_");
Source

pub fn with_file<P: AsRef<Path>>(self, path: P) -> Self

Add a configuration file with smart format detection

Uses the Universal provider for automatic format detection and caching. Supports .toml, .yaml/.yml, .json files with fallback chains.

§Examples
use superconfig::SuperConfig;

let config = SuperConfig::new()
    .with_file("config")        // Auto-detects config.toml, config.yaml, etc.
    .with_file("app.json");     // Explicit JSON file
Source

pub fn with_env<S: AsRef<str>>(self, prefix: S) -> Self

Add environment variables with a prefix

Uses the Nested provider for JSON parsing and automatic nesting. Supports complex structures like arrays and objects in environment variables.

§Examples
use superconfig::SuperConfig;

let config = SuperConfig::new()
    .with_env("APP_")           // APP_DATABASE_HOST, APP_FEATURES, etc.
    .with_env("MYAPP_");        // Multiple prefixes supported
Source

pub fn with_hierarchical_config<S: AsRef<str>>(self, base_name: S) -> Self

Add hierarchical configuration cascade

Uses the Wildcard provider for Git-like config inheritance: system → user → project levels with automatic discovery.

§Examples
use superconfig::SuperConfig;

let config = SuperConfig::new()
    .with_hierarchical_config("myapp");  // Loads system, user, project configs
Source

pub fn with_defaults<T: Serialize>(self, defaults: T) -> Self

Add default configuration values from a serializable struct

Uses Figment’s Serialized provider to set defaults that can be overridden by other configuration sources.

§Examples
use superconfig::SuperConfig;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Default)]
struct Config {
    host: String,
    port: u16,
}

let config = SuperConfig::new()
    .with_defaults(Config::default())
    .with_file("config.toml");
Source

pub fn with_defaults_string(self, content: &str) -> Self

Add default configuration from a raw string (TOML, JSON, or YAML)

Uses the Universal provider to parse the string content with automatic format detection. Perfect for embedded configuration strings.

§Examples
use superconfig::SuperConfig;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
struct CliArgs { host: Option<String> }

// Embedded default configuration (common pattern)
const DEFAULT_CONFIG: &str = r#"
host = "localhost"
port = 8080

[database]
url = "postgres://localhost"
timeout = 30
"#;

let cli_args = CliArgs { host: None };
let config = SuperConfig::new()
    .with_defaults_string(DEFAULT_CONFIG)  // Load TOML string as defaults
    .with_hierarchical_config("myapp")     // Apply hierarchical configs
    .with_env("APP_")                      // Apply env variables
    .with_cli_opt(Some(cli_args));         // Apply CLI overrides
Source

pub fn with_cli_opt<T: Serialize>(self, cli_opt: Option<T>) -> Self

Add CLI option values with empty value filtering

Uses the Empty provider to filter out empty values while preserving meaningful falsy values (false, 0, etc.).

§Examples
use superconfig::SuperConfig;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
struct CliArgs {
    host: Option<String>,
    port: Option<u16>,
}

let cli_args = CliArgs { host: Some("localhost".to_string()), port: None };
let config = SuperConfig::new()
    .with_file("config.toml")
    .with_cli_opt(Some(cli_args));
Source

pub fn with_file_opt<P: AsRef<Path>>(self, path: Option<P>) -> Self

Add an optional configuration file with smart format detection

Uses the Universal provider for automatic format detection and caching. Only adds the file if the path is Some, otherwise returns self unchanged.

§Examples
use superconfig::SuperConfig;
use std::path::PathBuf;

let optional_config: Option<PathBuf> = Some("config.toml".into());
let config = SuperConfig::new()
    .with_file_opt(optional_config)    // Only loads if Some
    .with_env("APP_");
Source

pub fn with_env_ignore_empty<S: AsRef<str>>(self, prefix: S) -> Self

Add environment variables with a prefix and empty value filtering

Combines the Nested provider for JSON parsing and automatic nesting with the Empty provider to filter out empty values.

§Examples
use superconfig::SuperConfig;

let config = SuperConfig::new()
    .with_env_ignore_empty("APP_");  // Filters empty env vars
Source§

impl SuperConfig

Source

pub fn merge<P: Provider>(self, provider: P) -> Self

Merge a provider with warning collection and array merging

This method extends Figment’s merge functionality by:

  1. Collecting validation warnings from providers (like Wildcard) if they support it
  2. Continuing configuration loading even if providers have validation errors
  3. Applying array merging with _add/_remove patterns
§Examples
use superconfig::{SuperConfig, Wildcard};

let config = SuperConfig::new()
    .merge(Wildcard::new("invalid[pattern"))  // Stores warning, continues
    .merge(Wildcard::new("*.toml"));          // Normal loading
     
// Check for warnings after loading
for warning in config.warnings() {
    eprintln!("Configuration warning: {}", warning);
}
Source

pub fn merge_validated<P: Provider + ValidatedProvider>( self, provider: P, ) -> Self

Merge a validated provider with warning collection

Source

pub fn merge_opt<P: Provider>(self, provider: Option<P>) -> Self

Merge an optional provider with warning collection

Convenience method for merging optional providers. If the provider is None, no merge operation is performed.

§Examples
use superconfig::{SuperConfig, Wildcard};

let optional_config = Some(Wildcard::new("*.toml"));
let config = SuperConfig::new()
    .merge_opt(optional_config);
Source

pub fn warnings(&self) -> &[String]

Get all collected warnings

Returns a slice of warning messages collected during configuration loading. Warnings indicate non-fatal issues like invalid patterns in providers that were safely handled without stopping the configuration process.

§Examples
use superconfig::{SuperConfig, Wildcard};

let config = SuperConfig::new()
    .merge(Wildcard::new("invalid[pattern"));
     
assert!(!config.warnings().is_empty());
println!("Warnings: {:?}", config.warnings());
Source

pub fn has_warnings(&self) -> bool

Check if there are any warnings

Returns true if any providers generated validation warnings during loading.

§Examples
use superconfig::{SuperConfig, Wildcard};

let config = SuperConfig::new()
    .merge(Wildcard::new("*.toml"));
     
if config.has_warnings() {
    eprintln!("Configuration loaded with warnings");
}
Source

pub fn print_warnings(&self)

Print all warnings to stderr

Convenience method to display all collected warnings. Useful during application startup to alert users about configuration issues.

§Examples
use superconfig::{SuperConfig, Wildcard};

let config = SuperConfig::new()
    .merge(Wildcard::new("invalid[pattern"))
    .merge(Wildcard::new("*.toml"));
     
config.print_warnings(); // Prints to stderr if any warnings exist
Source§

impl SuperConfig

Source

pub fn new() -> Self

Create a new SuperConfig instance

Source

pub fn from_figment(figment: Figment) -> Self

Create SuperConfig from an existing Figment

Source

pub fn extract<'de, T: Deserialize<'de>>(&self) -> Result<T, Error>

Extract configuration directly (equivalent to calling .extract() on the inner Figment)

This is a convenience method that makes the SuperConfig API more fluent by avoiding the need to dereference before extraction.

§Examples
use superconfig::SuperConfig;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Default)]
struct Config {
    #[serde(default)]
    host: String,
    #[serde(default)]
    port: u16,
}

let config: Config = SuperConfig::new()
    .with_defaults(Config::default())
    .with_file("config.toml")
    .with_env("APP_")
    .extract()?;                 // Direct extraction with all enhancements
Source§

impl SuperConfig

Source

pub fn verbosity(&self) -> VerbosityLevel

Get the current verbosity level

Source

pub fn debug_messages(&self) -> Vec<DebugMessage>

Get all collected debug messages

Source

pub fn debug_messages_at_level( &self, level: VerbosityLevel, ) -> Vec<DebugMessage>

Get debug messages filtered by verbosity level

Source

pub fn print_debug_messages(&self)

Print all debug messages at or below the current verbosity level

Source

pub fn clear_debug_messages(&self)

Clear all collected debug messages

Methods from Deref<Target = Figment>§

Source

pub fn focus(&self, key: &str) -> Figment

Returns a new Figment containing only the sub-dictionaries at key.

This “sub-figment” is a focusing of self with the property that:

  • self.find(key + ".sub") <=> focused.find("sub")

In other words, all values in self with a key starting with key are in focused without the prefix and vice-versa.

§Example
use figment::{Figment, providers::{Format, Toml}};

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#"
        cat = [1, 2, 3]
        dog = [4, 5, 6]

        [subtree]
        cat = "meow"
        dog = "woof!"

        [subtree.bark]
        dog = true
        cat = false
    "#)?;

    let root = Figment::from(Toml::file("Config.toml"));
    assert_eq!(root.extract_inner::<Vec<u8>>("cat").unwrap(), vec![1, 2, 3]);
    assert_eq!(root.extract_inner::<Vec<u8>>("dog").unwrap(), vec![4, 5, 6]);
    assert_eq!(root.extract_inner::<String>("subtree.cat").unwrap(), "meow");
    assert_eq!(root.extract_inner::<String>("subtree.dog").unwrap(), "woof!");

    let subtree = root.focus("subtree");
    assert_eq!(subtree.extract_inner::<String>("cat").unwrap(), "meow");
    assert_eq!(subtree.extract_inner::<String>("dog").unwrap(), "woof!");
    assert_eq!(subtree.extract_inner::<bool>("bark.cat").unwrap(), false);
    assert_eq!(subtree.extract_inner::<bool>("bark.dog").unwrap(), true);

    let bark = subtree.focus("bark");
    assert_eq!(bark.extract_inner::<bool>("cat").unwrap(), false);
    assert_eq!(bark.extract_inner::<bool>("dog").unwrap(), true);

    let not_a_dict = root.focus("cat");
    assert!(not_a_dict.extract_inner::<bool>("cat").is_err());
    assert!(not_a_dict.extract_inner::<bool>("dog").is_err());

    Ok(())
});
Source

pub fn extract<'a, T>(&self) -> Result<T, Error>
where T: Deserialize<'a>,

Deserializes the collected value into T.

§Example
use serde::Deserialize;

use figment::{Figment, providers::{Format, Toml, Json, Env}};

#[derive(Debug, PartialEq, Deserialize)]
struct Config {
    name: String,
    numbers: Option<Vec<usize>>,
    debug: bool,
}

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#"
        name = "test"
        numbers = [1, 2, 3, 10]
    "#)?;

    jail.set_env("config_name", "env-test");

    jail.create_file("Config.json", r#"
        {
            "name": "json-test",
            "debug": true
        }
    "#)?;

    let config: Config = Figment::new()
        .merge(Toml::file("Config.toml"))
        .merge(Env::prefixed("CONFIG_"))
        .join(Json::file("Config.json"))
        .extract()?;

    assert_eq!(config, Config {
        name: "env-test".into(),
        numbers: vec![1, 2, 3, 10].into(),
        debug: true
    });

    Ok(())
});
Source

pub fn extract_lossy<'a, T>(&self) -> Result<T, Error>
where T: Deserialize<'a>,

As extract, but interpret numbers and booleans more flexibly.

See Value::to_bool_lossy and Value::to_num_lossy for a full explanation of the imputs accepted.

§Example
use serde::Deserialize;

use figment::{Figment, providers::{Format, Toml, Json, Env}};

#[derive(Debug, PartialEq, Deserialize)]
struct Config {
    name: String,
    numbers: Option<Vec<usize>>,
    debug: bool,
}

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#"
        name = "test"
        numbers = ["1", "2", "3", "10"]
    "#)?;

    jail.set_env("config_name", "env-test");

    jail.create_file("Config.json", r#"
        {
            "name": "json-test",
            "debug": "yes"
        }
    "#)?;

    let config: Config = Figment::new()
        .merge(Toml::file("Config.toml"))
        .merge(Env::prefixed("CONFIG_"))
        .join(Json::file("Config.json"))
        .extract_lossy()?;

    assert_eq!(config, Config {
        name: "env-test".into(),
        numbers: vec![1, 2, 3, 10].into(),
        debug: true
    });

    Ok(())
});
Source

pub fn extract_inner<'a, T>(&self, path: &str) -> Result<T, Error>
where T: Deserialize<'a>,

Deserializes the value at the key path in the collected value into T.

§Example
use figment::{Figment, providers::{Format, Toml, Json}};

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#"
        numbers = [1, 2, 3, 10]
    "#)?;

    jail.create_file("Config.json", r#"{ "debug": true } "#)?;

    let numbers: Vec<usize> = Figment::new()
        .merge(Toml::file("Config.toml"))
        .join(Json::file("Config.json"))
        .extract_inner("numbers")?;

    assert_eq!(numbers, vec![1, 2, 3, 10]);

    Ok(())
});
Source

pub fn extract_inner_lossy<'a, T>(&self, path: &str) -> Result<T, Error>
where T: Deserialize<'a>,

As extract, but interpret numbers and booleans more flexibly.

See Value::to_bool_lossy and Value::to_num_lossy for a full explanation of the imputs accepted.

§Example
use figment::{Figment, providers::{Format, Toml, Json}};

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#"
        numbers = ["1", "2", "3", "10"]
    "#)?;

    jail.create_file("Config.json", r#"{ "debug": true } "#)?;

    let numbers: Vec<usize> = Figment::new()
        .merge(Toml::file("Config.toml"))
        .join(Json::file("Config.json"))
        .extract_inner_lossy("numbers")?;

    assert_eq!(numbers, vec![1, 2, 3, 10]);

    Ok(())
});
Source

pub fn metadata(&self) -> impl Iterator<Item = &Metadata>

Returns an iterator over the metadata for all of the collected values in the order in which they were added to self.

§Example
use figment::{Figment, providers::{Format, Toml, Json}};

let figment = Figment::new()
    .merge(Toml::file("Config.toml"))
    .join(Json::file("Config.json"));

assert_eq!(figment.metadata().count(), 2);
for (i, md) in figment.metadata().enumerate() {
    match i {
        0 => assert!(md.name.starts_with("TOML")),
        1 => assert!(md.name.starts_with("JSON")),
        _ => unreachable!(),
    }
}
Source

pub fn profile(&self) -> &Profile

Returns the selected profile.

§Example
use figment::Figment;

let figment = Figment::new();
assert_eq!(figment.profile(), "default");

let figment = figment.select("staging");
assert_eq!(figment.profile(), "staging");
Source

pub fn profiles(&self) -> impl Iterator<Item = &Profile>

Returns an iterator over profiles with valid configurations in this figment. Note: this may not include the selected profile if the selected profile has no configured values.

§Example
use figment::{Figment, providers::Serialized};

let figment = Figment::new();
let profiles = figment.profiles().collect::<Vec<_>>();
assert_eq!(profiles.len(), 0);

let figment = Figment::new()
    .join(Serialized::default("key", "hi"))
    .join(Serialized::default("key", "hey").profile("debug"));

let mut profiles = figment.profiles().collect::<Vec<_>>();
profiles.sort();
assert_eq!(profiles, &["debug", "default"]);

let figment = Figment::new()
    .join(Serialized::default("key", "hi").profile("release"))
    .join(Serialized::default("key", "hi").profile("testing"))
    .join(Serialized::default("key", "hey").profile("staging"))
    .select("debug");

let mut profiles = figment.profiles().collect::<Vec<_>>();
profiles.sort();
assert_eq!(profiles, &["release", "staging", "testing"]);
Source

pub fn find_value(&self, path: &str) -> Result<Value, Error>

Finds the value at path in the combined value.

If there is an error evaluating the combined figment, that error is returned. Otherwise if there is a value at path, returns Ok(value), and if there is no value at path, returns Err of kind MissingField.

See Value::find() for details on the syntax for path.

§Example
use serde::Deserialize;

use figment::{Figment, providers::{Format, Toml, Json, Env}};

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#"
        name = "test"

        [package]
        name = "my-package"
    "#)?;

    jail.create_file("Config.json", r#"
        {
            "author": { "name": "Bob" }
        }
    "#)?;

    let figment = Figment::new()
        .merge(Toml::file("Config.toml"))
        .join(Json::file("Config.json"));

    let name = figment.find_value("name")?;
    assert_eq!(name.as_str(), Some("test"));

    let package_name = figment.find_value("package.name")?;
    assert_eq!(package_name.as_str(), Some("my-package"));

    let author_name = figment.find_value("author.name")?;
    assert_eq!(author_name.as_str(), Some("Bob"));

    Ok(())
});
Source

pub fn contains(&self, path: &str) -> bool

Returns true if the combined figment evaluates successfully and contains a value at path.

See Value::find() for details on the syntax for path.

§Example
use serde::Deserialize;

use figment::{Figment, providers::{Format, Toml, Json, Env}};

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#"
        name = "test"

        [package]
        name = "my-package"
    "#)?;

    jail.create_file("Config.json", r#"
        {
            "author": { "name": "Bob" }
        }
    "#)?;

    let figment = Figment::new()
        .merge(Toml::file("Config.toml"))
        .join(Json::file("Config.json"));

    assert!(figment.contains("name"));
    assert!(figment.contains("package"));
    assert!(figment.contains("package.name"));
    assert!(figment.contains("author"));
    assert!(figment.contains("author.name"));
    assert!(!figment.contains("author.title"));
    Ok(())
});
Source

pub fn find_metadata(&self, key: &str) -> Option<&Metadata>

Finds the metadata for the value at key path. See Value::find() for details on the syntax for key.

§Example
use serde::Deserialize;

use figment::{Figment, providers::{Format, Toml, Json, Env}};

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#" name = "test" "#)?;
    jail.set_env("CONF_AUTHOR", "Bob");

    let figment = Figment::new()
        .merge(Toml::file("Config.toml"))
        .join(Env::prefixed("CONF_").only(&["author"]));

    let name_md = figment.find_metadata("name").unwrap();
    assert!(name_md.name.starts_with("TOML"));

    let author_md = figment.find_metadata("author").unwrap();
    assert!(author_md.name.contains("CONF_"));
    assert!(author_md.name.contains("environment"));

    Ok(())
});
Source

pub fn get_metadata(&self, tag: Tag) -> Option<&Metadata>

Returns the metadata with the given tag if this figment contains a value with said metadata.

§Example
use serde::Deserialize;

use figment::{Figment, providers::{Format, Toml, Json, Env}};

figment::Jail::expect_with(|jail| {
    jail.create_file("Config.toml", r#" name = "test" "#)?;
    jail.create_file("Config.json", r#" { "author": "Bob" } "#)?;

    let figment = Figment::new()
        .merge(Toml::file("Config.toml"))
        .join(Json::file("Config.json"));

    let name = figment.find_value("name").unwrap();
    let metadata = figment.get_metadata(name.tag()).unwrap();
    assert!(metadata.name.starts_with("TOML"));

    let author = figment.find_value("author").unwrap();
    let metadata = figment.get_metadata(author.tag()).unwrap();
    assert!(metadata.name.starts_with("JSON"));

    Ok(())
});

Trait Implementations§

Source§

impl Debug for SuperConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DebugCollector for SuperConfig

Source§

fn debug(&self, level: VerbosityLevel, provider: &str, message: &str)

Add a debug message
Source§

fn debug_step( &self, level: VerbosityLevel, provider: &str, step: usize, message: &str, )

Add a debug message with step information
Source§

fn debug_result( &self, level: VerbosityLevel, provider: &str, message: &str, success: bool, )

Add a debug message with success/failure indication
Source§

fn debug_step_result( &self, level: VerbosityLevel, provider: &str, step: usize, message: &str, success: bool, )

Add a debug message with both step and success information
Source§

impl Default for SuperConfig

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl From<Figment> for SuperConfig

Source§

fn from(figment: Figment) -> Self

Converts to this type from the input type.
Source§

impl From<SuperConfig> for Figment

Source§

fn from(super_figment: SuperConfig) -> Self

Converts to this type from the input type.
Source§

impl Deref for SuperConfig

Deref to Figment provides 100% compatibility - all Figment methods work seamlessly

Source§

type Target = Figment

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Paint for T
where T: ?Sized,

Source§

fn fg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the foreground set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like red() and green(), which have the same functionality but are pithier.

§Example

Set foreground color to white using fg():

use yansi::{Paint, Color};

painted.fg(Color::White);

Set foreground color to white using white().

use yansi::Paint;

painted.white();
Source§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
Source§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
Source§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
Source§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
Source§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
Source§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
Source§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
Source§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
Source§

fn bg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the background set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like on_red() and on_green(), which have the same functionality but are pithier.

§Example

Set background color to red using fg():

use yansi::{Paint, Color};

painted.bg(Color::Red);

Set background color to red using on_red().

use yansi::Paint;

painted.on_red();
Source§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
Source§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
Source§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
Source§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
Source§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
Source§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
Source§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
Source§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
Source§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
Source§

fn attr(&self, value: Attribute) -> Painted<&T>

Enables the styling Attribute value.

This method should be used rarely. Instead, prefer to use attribute-specific builder methods like bold() and underline(), which have the same functionality but are pithier.

§Example

Make text bold using attr():

use yansi::{Paint, Attribute};

painted.attr(Attribute::Bold);

Make text bold using using bold().

use yansi::Paint;

painted.bold();
Source§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
Source§

fn quirk(&self, value: Quirk) -> Painted<&T>

Enables the yansi Quirk value.

This method should be used rarely. Instead, prefer to use quirk-specific builder methods like mask() and wrap(), which have the same functionality but are pithier.

§Example

Enable wrapping using .quirk():

use yansi::{Paint, Quirk};

painted.quirk(Quirk::Wrap);

Enable wrapping using wrap().

use yansi::Paint;

painted.wrap();
Source§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
Source§

fn clear(&self) -> Painted<&T>

👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear(). The clear() method will be removed in a future release.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
Source§

fn whenever(&self, value: Condition) -> Painted<&T>

Conditionally enable styling based on whether the Condition value applies. Replaces any previous condition.

See the crate level docs for more details.

§Example

Enable styling painted only when both stdout and stderr are TTYs:

use yansi::{Paint, Condition};

painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
Source§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.