mirror of
https://github.com/kristoferssolo/filecaster.git
synced 2025-10-21 19:00:34 +00:00
80 lines
2.5 KiB
Markdown
80 lines
2.5 KiB
Markdown
# 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<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);
|
|
}
|
|
```
|
|
|
|
## 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.
|