Go to file
2025-07-15 19:38:06 +03:00
.github/workflows chore: package derive lib 2025-07-15 16:36:59 +03:00
filecaster feat(examples): add simple example 2025-07-15 19:38:06 +03:00
filecaster-derive feat(examples): add simple example 2025-07-15 19:38:06 +03:00
.gitignore Initial commit 2025-07-14 18:14:49 +03:00
Cargo.lock feat(examples): add simple example 2025-07-15 19:38:06 +03:00
Cargo.toml fix: feature derive clause 2025-07-15 17:32:33 +03:00
LICENSE-APACHE Create LICENSE-APACHE 2025-07-14 19:02:54 +03:00
LICENSE-MIT Create LICENSE-MIT 2025-07-14 19:03:11 +03:00
README.md fix: clippy needless doctest main warning 2025-07-15 19:16:34 +03:00

derive(FromFile)

Procedural macro to derive configuration from files, with optional merging capabilities.

Features

  • Derive Configuration: Easily load configuration from files into your Rust structs.
  • Default Values: Specify default values for struct fields using the #[from_file(default = "...")] attribute.
  • Optional Merging: When the merge feature is enabled, allows merging multiple configuration sources.

Usage

[dependencies]
filecaster = "0.2"
use filecaster::FromFile;

#[derive(Debug, Clone, PartialEq, FromFile)]
struct AppConfig {
    /// If the user does not specify a host, use `"127.0.0.1"`.
    #[from_file(default = "127.0.0.1")]
    host: String,

    /// Port number; defaults to `8080`.
    #[from_file(default = 8080)]
    port: u16,

    /// If not set, use `false`. Requires `bool: Default`.
    auto_reload: bool,
}

fn main() {
    // Simulate file content (e.g., from a JSON file)
    let file_content = r#"{ "host": "localhost", "port": 3000 }"#;

    // The `AppConfigFile` struct is automatically generated by `#[derive(FromFile)]`.
    // It has all fields as `Option<T>`.
    let partial_config: AppConfigFile = serde_json::from_str(file_content).unwrap();
    let partial_config2 = partial_config.clone();

    // Use the generated `from_file` method to get the final config.
    // Default values are applied for missing fields.
    let config = AppConfig::from_file(Some(partial_config));
    // or
    let config: AppConfig = partial_config2.into();

    assert_eq!(config.host, "localhost");
    assert_eq!(config.port, 3000);
    assert_eq!(config.auto_reload, false); // `Default::default()` for bool is `false`

    println!("Final Config: {:#?}", config);

    // Example with no file content (all defaults)
    let default_config = AppConfig::from_file(None);
    assert_eq!(default_config.host, "127.0.0.1");
    assert_eq!(default_config.port, 8080);
    assert_eq!(default_config.auto_reload, false);
}

Documentation

Full documentation is available at docs.rs.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is dual-licensed under either:

at your option.