filecaster-derive

Crates.iofilecaster-derive
lib.rsfilecaster-derive
version0.2.3
created_at2025-07-15 13:43:55.971517+00
updated_at2025-07-15 16:52:48.712726+00
descriptionProcedural derive macro for `filecaster`: automatically implement `FromFile` for your structs.
homepagehttps://github.com/kristoferssolo/filecaster
repositoryhttps://github.com/kristoferssolo/filecaster
max_upload_size
id1753372
size22,551
Kristofers Solo (kristoferssolo)

documentation

https://docs.rs/filecaster-derive

README

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); // `bool::default()` 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);
}

Examples

Use cargo run --example <example_name> to execute a specific example. For example:

cargo run --example simple
cargo run --example nested

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.

Commit count: 0

cargo fmt