diff --git a/src/lib.rs b/src/lib.rs index 9e0fb78..237b1b2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,6 +14,7 @@ pub mod pcd; pub mod prd; pub mod process; pub mod secrets; +pub mod serialization; pub mod signature; pub mod silentpayments; diff --git a/src/serialization.rs b/src/serialization.rs new file mode 100644 index 0000000..2eb0688 --- /dev/null +++ b/src/serialization.rs @@ -0,0 +1,103 @@ +use serde::{Deserialize, Serialize}; +use sp_client::bitcoin::OutPoint; +use std::collections::HashMap; +use crate::{pcd::Member, process::Process}; + +#[derive(Serialize, Deserialize)] +pub struct MemberOutPointMap(#[serde(with = "members_map")] pub HashMap); + +#[derive(Serialize, Deserialize)] +pub struct OutPointProcessMap(#[serde(with = "outpoint_map")] pub HashMap); + +pub mod members_map { + use crate::pcd::Member; + use serde::{Serialize, Serializer, Deserialize, Deserializer}; + use std::collections::HashMap; + use sp_client::bitcoin::OutPoint; + + pub fn serialize( + map: &HashMap, + serializer: S, + ) -> Result + where + S: Serializer, + { + let map: HashMap = map + .iter() + .map(|(k, v)| (k.to_string(), *v)) + .collect(); + map.serialize(serializer) + } + + pub fn deserialize<'de, D>( + deserializer: D, + ) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let map: HashMap = HashMap::deserialize(deserializer)?; + + let result: Result, D::Error> = map + .into_iter() + .map(|(k, v)| { + let member = k + .split(',') + .map(|s| s.try_into()) + .collect::, _>>() + .map_err(serde::de::Error::custom)?; + let member = Member::new(member).map_err(serde::de::Error::custom)?; + Ok((member, v)) + }) + .collect(); + + result + } +} + +pub mod outpoint_map { + use serde::{Serialize, Serializer, Deserialize, Deserializer}; + use std::collections::HashMap; + use sp_client::bitcoin::OutPoint; + use crate::process::Process; + + pub fn serialize( + map: &HashMap, + serializer: S, + ) -> Result + where + S: Serializer, + { + // Convert OutPoint keys to Strings + let map: HashMap = map + .into_iter() + .map(|(k, v)| (k.to_string(), v.clone())) + .collect(); + + // Serialize as HashMap + map.serialize(serializer) + } + + pub fn deserialize<'de, D>( + deserializer: D, + ) -> Result, D::Error> + where + D: Deserializer<'de>, + { + // Deserialize as HashMap + let map: HashMap = HashMap::deserialize(deserializer)?; + + // Convert String keys back to OutPoint + let result: Result, D::Error> = map + .into_iter() + .map(|(k, v)| { + let outpoint = k + .parse() + .map_err(serde::de::Error::custom)?; + Ok((outpoint, v)) + }) + .collect(); + + result + } +} +