Something went wrong. Try again.
fork of hydrant
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110pub(crate) use super::v2::Commit;use crate::db::types::DidKey;use jacquard_common::CowStr;use jacquard_common::types::string::Handle;use serde::{Deserialize, Serialize};use smol_str::SmolStr;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]pub enum RepoStatus { Synced, Error(SmolStr), Deactivated, Takendown, Suspended, Deleted, Desynchronized, Throttled,}
#[derive(Debug, Clone, Serialize, Deserialize)]#[serde(bound(deserialize = "'i: 'de"))]pub(crate) struct RepoState<'i> { pub active: bool, pub status: RepoStatus, pub root: Option<Commit>, pub last_message_time: Option<i64>, pub last_updated_at: i64, // unix timestamp #[serde(borrow)] pub signing_key: Option<DidKey<'i>>, #[serde(borrow)] pub pds: Option<CowStr<'i>>, pub handle: Option<Handle>,}
#[derive(Debug, Clone, Serialize, Deserialize)]pub(crate) struct RepoMetadata { pub tracked: bool, pub index_id: u64,}
#[cfg(test)]mod tests { use super::*;
#[test] fn v4_persisted_schema_golden_fixtures() { for (status, golden) in [ (RepoStatus::Synced, "a653796e636564"), ( RepoStatus::Error("stinkpot".into()), "81a54572726f72a87374696e6b706f74", ), (RepoStatus::Deactivated, "ab4465616374697661746564"), (RepoStatus::Takendown, "a954616b656e646f776e"), (RepoStatus::Suspended, "a953757370656e646564"), (RepoStatus::Deleted, "a744656c65746564"), (RepoStatus::Desynchronized, "ae446573796e6368726f6e697a6564"), (RepoStatus::Throttled, "a95468726f74746c6564"), ] { let encoded = rmp_serde::to_vec(&status).unwrap(); assert_eq!(hex::encode(&encoded), golden); assert_eq!( rmp_serde::from_slice::<RepoStatus>(&encoded).unwrap(), status ); }
let state = RepoState { active: false, status: RepoStatus::Throttled, root: None, last_message_time: Some(7), last_updated_at: 42, signing_key: Some(DidKey(std::borrow::Cow::Borrowed(&[0xed, 1, 2, 3]))), pds: Some("https://pds.example".into()), handle: Some(Handle::new_static("alice.test").unwrap()), }; let encoded = rmp_serde::to_vec(&state).unwrap(); assert_eq!( hex::encode(&encoded), "98c2a95468726f74746c6564c0072ac404ed010203b368747470733a2f2f7064732e6578616d706c65aa616c6963652e74657374" ); let decoded: RepoState<'_> = rmp_serde::from_slice(&encoded).unwrap(); assert!(!decoded.active); assert_eq!(decoded.status, RepoStatus::Throttled); assert_eq!(decoded.last_message_time, Some(7)); assert_eq!(decoded.last_updated_at, 42); assert!(decoded.root.is_none()); assert_eq!( decoded.signing_key.as_ref().map(|key| key.0.as_ref()), Some([0xed, 1, 2, 3].as_slice()) ); assert_eq!(decoded.pds.as_deref(), Some("https://pds.example")); assert_eq!( decoded.handle.as_ref().map(Handle::as_str), Some("alice.test") );
let metadata = RepoMetadata { tracked: true, index_id: 7, }; let encoded = rmp_serde::to_vec(&metadata).unwrap(); assert_eq!(hex::encode(&encoded), "92c307"); let decoded: RepoMetadata = rmp_serde::from_slice(&encoded).unwrap(); assert!(decoded.tracked); assert_eq!(decoded.index_id, 7); }}