From b2d8a759ef4e0a58d879807e0bd2ee01a4163d11 Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Sun, 19 Apr 2026 15:01:09 -0400 Subject: [PATCH] fix(core): SymbolCharset needs content="value" for Custom(String) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same latent bug as TrashRetention/HistoryRetention — serde's internally-tagged repr cannot merge a newtype primitive payload into a tag object. Add regression test for Custom round-trip. Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/idfoto-core/src/settings.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/idfoto-core/src/settings.rs b/crates/idfoto-core/src/settings.rs index 7557252..ccc8c96 100644 --- a/crates/idfoto-core/src/settings.rs +++ b/crates/idfoto-core/src/settings.rs @@ -95,7 +95,7 @@ pub struct CharClasses { } #[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(tag = "kind", rename_all = "snake_case")] +#[serde(tag = "kind", content = "value", rename_all = "snake_case")] pub enum SymbolCharset { SafeOnly, Extended, @@ -170,4 +170,15 @@ mod tests { _ => panic!("expected Random default"), } } + + #[test] + fn symbol_charset_custom_round_trips() { + let c = SymbolCharset::Custom("!@#".into()); + let json = serde_json::to_string(&c).unwrap(); + let parsed: SymbolCharset = serde_json::from_str(&json).unwrap(); + match parsed { + SymbolCharset::Custom(s) => assert_eq!(s, "!@#"), + other => panic!("expected Custom, got {:?}", other), + } + } }