enostr: use data instead of strings in Pubkey and EventId

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-02-07 12:02:13 -08:00
parent 6c2c352e6f
commit 9a9bb13e08
5 changed files with 162 additions and 70 deletions

View File

@@ -1,28 +1,61 @@
use serde_derive::{Deserialize, Serialize};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone, Hash)]
pub struct Pubkey(String);
use crate::Error;
use hex;
use log::debug;
use nostr::key::XOnlyPublicKey;
use std::fmt;
impl AsRef<str> for Pubkey {
fn as_ref(&self) -> &str {
&self.0
#[derive(Debug, Eq, PartialEq, Clone, Hash)]
pub struct Pubkey(XOnlyPublicKey);
impl Pubkey {
pub fn hex(&self) -> String {
hex::encode(self.bytes())
}
pub fn bytes(&self) -> [u8; 32] {
self.0.serialize()
}
pub fn from_hex(hex_str: &str) -> Result<Self, Error> {
Ok(Pubkey(XOnlyPublicKey::from_slice(
hex::decode(hex_str)?.as_slice(),
)?))
}
}
impl From<String> for Pubkey {
fn from(s: String) -> Self {
Pubkey(s)
}
}
impl From<&str> for Pubkey {
fn from(s: &str) -> Self {
Pubkey(s.to_owned())
impl fmt::Display for Pubkey {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.hex())
}
}
impl From<Pubkey> for String {
fn from(pk: Pubkey) -> Self {
pk.0
pk.hex()
}
}
// Custom serialize function for Pubkey
impl Serialize for Pubkey {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&self.hex())
}
}
// Custom deserialize function for Pubkey
impl<'de> Deserialize<'de> for Pubkey {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
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)
}
}