# 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 ```toml [dependencies] filecaster = "0.2" ``` ```rust 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`. 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); } ``` ## Documentation Full documentation is available at [docs.rs](https://docs.rs/filecaster). ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License This project is dual-licensed under either: - MIT License ([LICENSE-MIT](LICENSE-MIT) or [http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT)) - Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)) at your option.