enostr: introduce PubkeyRef
This will be used for typesafe and copy-free pubkey references Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
|
||||
use crate::Error;
|
||||
use std::borrow::Borrow;
|
||||
use std::fmt;
|
||||
use std::ops::Deref;
|
||||
use tracing::debug;
|
||||
@@ -8,8 +9,35 @@ use tracing::debug;
|
||||
#[derive(Eq, PartialEq, Clone, Copy, Hash, Ord, PartialOrd)]
|
||||
pub struct Pubkey([u8; 32]);
|
||||
|
||||
#[derive(Eq, PartialEq, Clone, Copy, Hash, Ord, PartialOrd)]
|
||||
pub struct PubkeyRef<'a>(&'a [u8; 32]);
|
||||
|
||||
static HRP_NPUB: bech32::Hrp = bech32::Hrp::parse_unchecked("npub");
|
||||
|
||||
impl<'a> Borrow<[u8; 32]> for PubkeyRef<'a> {
|
||||
fn borrow(&self) -> &[u8; 32] {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> PubkeyRef<'a> {
|
||||
pub fn new(bytes: &'a [u8; 32]) -> Self {
|
||||
Self(bytes)
|
||||
}
|
||||
|
||||
pub fn bytes(&self) -> &[u8; 32] {
|
||||
self.0
|
||||
}
|
||||
|
||||
pub fn to_owned(&self) -> Pubkey {
|
||||
Pubkey::new(*self.bytes())
|
||||
}
|
||||
|
||||
pub fn hex(&self) -> String {
|
||||
hex::encode(self.bytes())
|
||||
}
|
||||
}
|
||||
|
||||
impl Deref for Pubkey {
|
||||
type Target = [u8; 32];
|
||||
|
||||
@@ -18,6 +46,12 @@ impl Deref for Pubkey {
|
||||
}
|
||||
}
|
||||
|
||||
impl Borrow<[u8; 32]> for Pubkey {
|
||||
fn borrow(&self) -> &[u8; 32] {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl Pubkey {
|
||||
pub fn new(data: [u8; 32]) -> Self {
|
||||
Self(data)
|
||||
@@ -31,6 +65,10 @@ impl Pubkey {
|
||||
&self.0
|
||||
}
|
||||
|
||||
pub fn as_ref(&self) -> PubkeyRef<'_> {
|
||||
PubkeyRef(self.bytes())
|
||||
}
|
||||
|
||||
pub fn parse(s: &str) -> Result<Self, Error> {
|
||||
match Pubkey::from_hex(s) {
|
||||
Ok(pk) => Ok(pk),
|
||||
@@ -88,6 +126,12 @@ impl fmt::Display for Pubkey {
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for PubkeyRef<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}", self.hex())
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Pubkey {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}", self.hex())
|
||||
|
||||
Reference in New Issue
Block a user