use serde::{Deserialize, Serialize}; use sp_client::bitcoin::OutPoint; use std::collections::HashMap; use crate::{pcd::Member, process::Process}; #[derive(Debug, Serialize, Deserialize)] pub struct OutPointMemberMap(#[serde(with = "members_map")] pub HashMap); #[derive(Debug, 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, v.to_owned())) .collect(); map.serialize(serializer) } pub fn deserialize<'de, D>( deserializer: D, ) -> Result, D::Error> where D: Deserializer<'de>, { let map: HashMap = HashMap::deserialize(deserializer)?; Ok(map) } } 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 } }