From 89732ff8e2b51aae6a2376302e1dfcc8deb94fbc Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Tue, 15 Jul 2025 19:16:34 +0300 Subject: [PATCH] fix: clippy needless doctest main warning --- README.md | 53 ++++++++++++++++++++++++------------ filecaster-derive/src/lib.rs | 23 ++++++++-------- filecaster/src/lib.rs | 20 +++++++++----- 3 files changed, 59 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 0493061..e6a8b60 100644 --- a/README.md +++ b/README.md @@ -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`. + 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); } ``` diff --git a/filecaster-derive/src/lib.rs b/filecaster-derive/src/lib.rs index d072173..815f9df 100644 --- a/filecaster-derive/src/lib.rs +++ b/filecaster-derive/src/lib.rs @@ -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`. //! 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); //! } //! ``` diff --git a/filecaster/src/lib.rs b/filecaster/src/lib.rs index 89d4ec5..a1397ad 100644 --- a/filecaster/src/lib.rs +++ b/filecaster/src/lib.rs @@ -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,12 +49,12 @@ //! struct AppConfigFile { //! host: Option, //! port: Option, -//! enabled: Option, +//! auto_reload: Option, //! } //! //! // The `FromFile` implementation is also automatically generated. //! // For demonstration, here's a simplified manual implementation: -//! impl FromFile for AppConfig { +//! impl FromFile for AppConfig { //! type Shadow = AppConfigFile; //! //! fn from_file(file: Option) -> Self { @@ -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); //! } //! ``` //!