From e1542d6d1f676b4fa153e3b7beafea734015e9f0 Mon Sep 17 00:00:00 2001 From: michael Date: Mon, 27 Apr 2026 10:47:01 -0700 Subject: [PATCH] feat(common): PendingStatus wire type + Default impl on PendingFlag PendingStatus carries an explicit 'present' bool next to a PendingFlag because zvariant doesn't support Option. Two new serde tests. Co-Authored-By: Claude Opus 4.7 (1M context) --- common/src/types.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/common/src/types.rs b/common/src/types.rs index bb4cd0a..9e86f31 100644 --- a/common/src/types.rs +++ b/common/src/types.rs @@ -36,7 +36,7 @@ pub struct Credential { pub created_unix: u64, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] pub struct PendingFlag { pub required_methods: Vec, pub created_unix: u64, @@ -46,6 +46,13 @@ pub struct PendingFlag { pub re_enroll: bool, } +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] +pub struct PendingStatus { + pub present: bool, + /// Contents are the default when `!present`; consumer must check `present` first. + pub flag: PendingFlag, +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] pub struct Violation { pub user: String, @@ -119,4 +126,30 @@ mod tests { let back: Credential = serde_json::from_str(&json).unwrap(); assert_eq!(c, back); } + + #[test] + fn pending_status_serde() { + let s = PendingStatus { + present: true, + flag: PendingFlag { + required_methods: vec![Method::Fido2], + created_unix: 1_700_000_000, + deadline_unix: 0, + re_enroll: false, + }, + }; + let bytes = serde_json::to_vec(&s).unwrap(); + let back: PendingStatus = serde_json::from_slice(&bytes).unwrap(); + assert_eq!(s, back); + } + + #[test] + fn pending_status_default_when_absent() { + let s = PendingStatus { + present: false, + flag: PendingFlag::default(), + }; + assert!(!s.present); + assert!(s.flag.required_methods.is_empty()); + } }