feat: Support bare `writable` nodes in KDL config
Bumps serde-kdl2 to 0.1.1-alpha.4 and uses its `bare_defaults`
deserializer so `writable` (without `#true`) means writable.
Assisted-by: Claude Opus 4.6 via pi
diff --git a/Cargo.lock b/Cargo.lock
index 3ebde19..0c916d8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -558,9 +558,9 @@ dependencies = [
[[package]]
name = "serde-kdl2"
-version = "0.1.0"
+version = "0.1.1-alpha.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9cea21f8a61b2de91d2edc3f523b9be71e380b6596d739638d9c20b70139de"
+checksum = "88a4b4201ac42c878b105d4f78b21162c39257f69a09e1c214fba9dac4fd12cd"
dependencies = [
"kdl",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index 1afb4b1..6897d71 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,7 +10,8 @@ clap = { version = "*", features = ["derive"] }
color-eyre = "*"
fs-err = "*"
serde = { version = "*", features = ["derive"] }
-serde-kdl2 = "*"
+# Pinned to prerelease — alpha.4 fixes serde defaults with bare KDL values.
+serde-kdl2 = "0.1.1-alpha.4"
serde_yaml = "*"
shellexpand = "*"
tracing = "*"
diff --git a/src/config.rs b/src/config.rs
index 09d7090..8cc6d44 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -12,7 +12,7 @@ pub struct Config {
pub struct Mount {
pub source: String,
pub target: Option<String>,
- #[serde(default)]
+ #[serde(default, deserialize_with = "serde_kdl2::bare_defaults::bool::bare_true")]
pub writable: bool,
}
@@ -175,6 +175,24 @@ mod tests {
assert!(!parsed.mounts[3].writable);
}
+ #[test]
+ fn kdl_bare_writable() {
+ let kdl_content = r#"
+ mounts {
+ source "~/.local/share/ranger"
+ writable
+ }
+ mounts {
+ source "~/.config/git"
+ }
+ "#;
+
+ let parsed: Config = serde_kdl2::from_str(kdl_content).unwrap();
+ assert_eq!(parsed.mounts.len(), 2);
+ assert!(parsed.mounts[0].writable);
+ assert!(!parsed.mounts[1].writable);
+ }
+
#[test]
fn kdl_parse_error_on_invalid_syntax() {
let invalid_kdl = "invalid_syntax_here{ missing closing brace";