use serde::{Deserialize, Deserializer, Serialize, Serializer}; use crate::Error; use hex; use log::debug; //use nostr::key::XOnlyPublicKey; use std::fmt; #[derive(Debug, Eq, PartialEq, Clone, Hash)] pub struct Pubkey([u8; 32]); impl Pubkey { pub fn new(data: &[u8; 32]) -> Self { Self(*data) } pub fn hex(&self) -> String { hex::encode(self.bytes()) } pub fn bytes(&self) -> &[u8; 32] { &self.0 } pub fn from_hex(hex_str: &str) -> Result { Ok(Pubkey(hex::decode(hex_str)?.as_slice().try_into()?)) } } impl fmt::Display for Pubkey { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.hex()) } } impl From for String { fn from(pk: Pubkey) -> Self { pk.hex() } } // Custom serialize function for Pubkey impl Serialize for Pubkey { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&self.hex()) } } // Custom deserialize function for Pubkey impl<'de> Deserialize<'de> for Pubkey { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { debug!("decoding pubkey start"); let s = String::deserialize(deserializer)?; debug!("decoding pubkey {}", &s); Pubkey::from_hex(&s).map_err(serde::de::Error::custom) } }