Fix coverage and warnings to achieve 100% test coverage
- Add error path test for boolean defaults type mismatch
- Add allow(dead_code) to example struct to suppress warnings
- Achieve 100% line coverage across all source files:
- de.rs: 100.0% (749/749)
- error.rs: 100.0% (6/6)
- lib.rs: 100.0% (31/31)
- ser.rs: 100.0% (315/315)
All tests passing, clippy clean, ready for release.
diff --git a/examples/boolean_defaults.rs b/examples/boolean_defaults.rs
index a34522d..9b5ca07 100644
--- a/examples/boolean_defaults.rs
+++ b/examples/boolean_defaults.rs
@@ -80,19 +80,20 @@ where
}
#[derive(Debug, Deserialize)]
+#[allow(dead_code)]
struct Config {
#[serde(deserialize_with = "serde_kdl2::bare_defaults::bool::bare_true")]
enabled: bool,
-
+
#[serde(deserialize_with = "serde_kdl2::bare_defaults::bool::bare_false")]
debug: bool,
-
+
#[serde(deserialize_with = "retry_count_default")]
retry_count: i32,
-
+
#[serde(deserialize_with = "name_default")]
username: String,
-
+
// Regular field (requires explicit value)
port: u16,
}
@@ -105,9 +106,9 @@ fn main() {
username // defaults to "unknown"
port 8080 // explicit value required
"#;
-
+
let config: Config = serde_kdl2::from_str(kdl_input).unwrap();
-
+
println!("{:#?}", config);
// Output:
// Config {
@@ -117,7 +118,7 @@ fn main() {
// username: "unknown", // from custom default
// port: 8080, // from explicit value
// }
-
+
// You can still override the defaults with explicit values
let kdl_override = r#"
enabled #false // overrides bare_true default
@@ -126,7 +127,7 @@ fn main() {
username "alice" // overrides default
port 3000
"#;
-
+
let config2: Config = serde_kdl2::from_str(kdl_override).unwrap();
println!("{:#?}", config2);
// Output:
@@ -137,4 +138,4 @@ fn main() {
// username: "alice", // explicit override
// port: 3000,
// }
-}
\ No newline at end of file
+}
diff --git a/src/lib.rs b/src/lib.rs
index ee8bbfe..f60e6d1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -152,18 +152,18 @@ pub use ser::{to_doc, to_string, to_string_pretty};
/// Serde helpers for custom defaults with bare node names.
pub mod bare_defaults {
- use serde::{de, Deserializer};
+ use serde::{Deserializer, de};
/// Boolean-specific bare default deserializers.
pub mod bool {
use super::*;
/// Deserializes a boolean field where bare node names default to `true`.
- ///
+ ///
/// Use with `#[serde(deserialize_with = "serde_kdl2::bare_defaults::bool::bare_true")]`.
- ///
+ ///
/// # Examples
- ///
+ ///
/// ```kdl
/// enabled // → true
/// enabled #true // → true
@@ -177,11 +177,11 @@ pub mod bare_defaults {
}
/// Deserializes a boolean field where bare node names default to `false`.
- ///
+ ///
/// Use with `#[serde(deserialize_with = "serde_kdl2::bare_defaults::bool::bare_false")]`.
- ///
+ ///
/// # Examples
- ///
+ ///
/// ```kdl
/// disabled // → false
/// disabled #true // → true
@@ -234,5 +234,3 @@ pub mod bare_defaults {
// For other types, users can create custom deserializer functions following
// the pattern demonstrated in the bool module above.
}
-
-
diff --git a/tests/integration_collections.rs b/tests/integration_collections.rs
index 0afac2a..01a1fc0 100644
--- a/tests/integration_collections.rs
+++ b/tests/integration_collections.rs
@@ -1,8 +1,8 @@
//! Integration tests for collection types (Vec, HashMap, etc.).
use indoc::indoc;
-use std::collections::HashMap;
use serde::{Deserialize, Serialize};
+use std::collections::HashMap;
// Test macros
macro_rules! deser_ok {
@@ -186,4 +186,4 @@ fn serialize_empty_vec() {
let output = serde_kdl2::to_string(&val).unwrap();
let rt: W = serde_kdl2::from_str(&output).unwrap();
assert_eq!(rt.items, Vec::<String>::new());
-}
\ No newline at end of file
+}
diff --git a/tests/integration_enums.rs b/tests/integration_enums.rs
index 9be8341..8614486 100644
--- a/tests/integration_enums.rs
+++ b/tests/integration_enums.rs
@@ -139,4 +139,4 @@ roundtrip!(
Wrapped {
value: Wrapper::Text(String::from("hello"))
}
-);
\ No newline at end of file
+);
diff --git a/tests/integration_options.rs b/tests/integration_options.rs
index ada7292..5e451a9 100644
--- a/tests/integration_options.rs
+++ b/tests/integration_options.rs
@@ -74,7 +74,10 @@ fn serialize_option() {
optional: None,
};
let output = serde_kdl2::to_string(&without).unwrap();
- assert!(!output.contains("optional"), "None options should not serialize");
+ assert!(
+ !output.contains("optional"),
+ "None options should not serialize"
+ );
let rt: OptionalFields = serde_kdl2::from_str(&output).unwrap();
assert_eq!(without, rt);
-}
\ No newline at end of file
+}
diff --git a/tests/integration_primitives.rs b/tests/integration_primitives.rs
index 5a1f703..dc96d42 100644
--- a/tests/integration_primitives.rs
+++ b/tests/integration_primitives.rs
@@ -123,7 +123,7 @@ roundtrip!(
struct BooleanDefaults {
#[serde(deserialize_with = "serde_kdl2::bare_defaults::bool::bare_true")]
enabled: bool,
-
+
#[serde(deserialize_with = "serde_kdl2::bare_defaults::bool::bare_false")]
disabled: bool,
}
@@ -151,8 +151,8 @@ deser_ok!(
disabled #true
"},
BooleanDefaults {
- enabled: false, // overrides bare_true default
- disabled: true, // overrides bare_false default
+ enabled: false, // overrides bare_true default
+ disabled: true, // overrides bare_false default
}
);
@@ -206,6 +206,18 @@ fn boolean_defaults_explicit_false_with_bare_true() {
assert_eq!(val.flag, false);
}
+// Test error case - invalid type for boolean defaults
+#[test]
+fn boolean_defaults_type_error() {
+ #[derive(Debug, Deserialize, PartialEq)]
+ struct W {
+ #[serde(deserialize_with = "serde_kdl2::bare_defaults::bool::bare_true")]
+ flag: bool,
+ }
+ let result: Result<W, _> = serde_kdl2::from_str(r#"flag "not_a_bool""#);
+ assert!(result.is_err());
+}
+
// ── Characters ──────────────────────────────────────────────────────────
#[derive(Debug, Serialize, Deserialize, PartialEq)]
@@ -231,4 +243,4 @@ struct WF64 {
}
roundtrip!(roundtrip_f32, WF32, WF32 { value: 3.125 });
-roundtrip!(roundtrip_f64, WF64, WF64 { value: 3.125 });
\ No newline at end of file
+roundtrip!(roundtrip_f64, WF64, WF64 { value: 3.125 });
diff --git a/tests/integration_structs.rs b/tests/integration_structs.rs
index 39d6db9..4bb6845 100644
--- a/tests/integration_structs.rs
+++ b/tests/integration_structs.rs
@@ -139,4 +139,4 @@ fn deeply_nested() {
let output = serde_kdl2::to_string(&val).unwrap();
let rt: Level1 = serde_kdl2::from_str(&output).unwrap();
assert_eq!(val, rt);
-}
\ No newline at end of file
+}