fix: clippy needless doctest main warning

This commit is contained in:
Kristofers Solo 2025-07-15 19:16:34 +03:00
parent 9d365a9593
commit 89732ff8e2
Signed by: kristoferssolo
GPG Key ID: 8687F2D3EEE6F0ED
3 changed files with 59 additions and 37 deletions

View File

@ -5,7 +5,7 @@ Procedural macro to derive configuration from files, with optional merging capab
## Features
- **Derive Configuration:** Easily load configuration from files into your Rust structs.
- **Default Values:** Specify default values for struct fields using the `#[default = "..."]` attribute.
- **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
@ -18,29 +18,46 @@ filecaster = "0.2"
```rust
use filecaster::FromFile;
#[derive(Debug, Clone, FromFile)]
pub struct MyConfig {
#[from_file(default = "localhost")]
pub host: String,
#[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)]
pub port: u16,
#[from_file(default = false)]
pub enabled: bool,
port: u16,
/// If not set, use `false`. Requires `bool: Default`.
auto_reload: bool,
}
fn main() {
// Simulate loading from a file (e.g., JSON, YAML, TOML)
let file_content = r#"
{
"host": "localhost"
}
"#;
// Simulate file content (e.g., from a JSON file)
let file_content = r#"{ "host": "localhost", "port": 3000 }"#;
let config_from_file: MyConfig = serde_json::from_str(file_content).unwrap();
let config = MyConfig::from_file(Some(config_from_file));
// 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();
println!("Config: {:?}", config);
// Expected output: Config { host: "localhost", port: 8080, enabled: false }
// 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);
}
```

View File

@ -34,39 +34,38 @@
//!
//! ```rust
//! use filecaster::FromFile;
//! use serde::{Deserialize, Serialize};
//!
//! #[derive(Debug, Clone, PartialEq, FromFile, Serialize, Deserialize)]
//! #[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,
//!
//! /// Number of worker threads; defaults to `4`.
//! #[from_file(default = 4)]
//! workers: usize,
//! /// Port number; defaults to `8080`.
//! #[from_file(default = 8080)]
//! port: u16,
//!
//! /// If not set, use `false`. Requires `bool: Default`.
//! auto_reload: bool,
//! }
//!
//! fn main() {
//! fn example() {
//! // Simulate file content (e.g., from a JSON file)
//! let file_content = r#"{
//! "host": "localhost",
//! "workers": 8
//! }"#;
//! 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.workers, 8);
//! assert_eq!(config.port, 3000);
//! assert_eq!(config.auto_reload, false); // `Default::default()` for bool is `false`
//!
//! println!("Final Config: {:#?}", config);
@ -74,7 +73,7 @@
//! // 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.workers, 4);
//! assert_eq!(default_config.port, 8080);
//! assert_eq!(default_config.auto_reload, false);
//! }
//! ```

View File

@ -40,7 +40,7 @@
//! struct AppConfig {
//! host: String,
//! port: u16,
//! enabled: bool,
//! auto_reload: bool,
//! }
//!
//! // The `Shadow` type is automatically generated by `filecaster-derive`
@ -49,7 +49,7 @@
//! struct AppConfigFile {
//! host: Option<String>,
//! port: Option<u16>,
//! enabled: Option<bool>,
//! auto_reload: Option<bool>,
//! }
//!
//! // The `FromFile` implementation is also automatically generated.
@ -62,12 +62,12 @@
//! AppConfig {
//! host: file.host.unwrap_or_else(|| "127.0.0.1".to_string()),
//! port: file.port.unwrap_or(8080),
//! enabled: file.enabled.unwrap_or(true),
//! auto_reload: file.auto_reload.unwrap_or(true),
//! }
//! }
//! }
//!
//! fn main() {
//! fn example() {
//! // Simulate deserializing from a file
//! let file_content = r#"{ "host": "localhost", "port": 3000 }"#;
//! let partial_config: AppConfigFile = serde_json::from_str(file_content).unwrap();
@ -77,9 +77,15 @@
//!
//! assert_eq!(config.host, "localhost");
//! assert_eq!(config.port, 3000);
//! assert_eq!(config.enabled, true); // Default value applied
//! assert_eq!(config.auto_reload, false); // `Default::default()` for bool is `false`
//!
//! println!("Final Config: {:?}", config);
//! 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);
//! }
//! ```
//!