Skip to main content

antenna_protocol/identity/
peer_id.rs

1use std::cmp::Ordering;
2use std::fmt;
3use std::hash::{Hash, Hasher};
4
5use base64::{Engine, prelude::BASE64_URL_SAFE_NO_PAD};
6use biscuit_auth::{Algorithm, PublicKey};
7use serde::{Deserialize, Deserializer, Serialize, Serializer};
8
9/// Mesh peer identifier — wraps the peer's biscuit public key directly.
10#[derive(Debug, Clone, Copy, Eq, PartialEq)]
11pub struct PeerID(pub PublicKey);
12
13impl PeerID {
14    pub fn new(pubkey: PublicKey) -> Self {
15        Self(pubkey)
16    }
17
18    pub fn pubkey(&self) -> PublicKey {
19        self.0
20    }
21
22    pub fn from_base64(s: &str) -> anyhow::Result<Self> {
23        let bytes = BASE64_URL_SAFE_NO_PAD.decode(s)?;
24        PublicKey::from_bytes(&bytes, Algorithm::Ed25519)
25            .map(Self)
26            .map_err(|e| anyhow::anyhow!("invalid peer id pubkey: {e}"))
27    }
28}
29
30impl Ord for PeerID {
31    fn cmp(&self, other: &Self) -> Ordering {
32        self.0.to_bytes().cmp(&other.0.to_bytes())
33    }
34}
35
36impl PartialOrd for PeerID {
37    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
38        Some(self.cmp(other))
39    }
40}
41
42impl Hash for PeerID {
43    fn hash<H: Hasher>(&self, state: &mut H) {
44        self.0.to_bytes().hash(state);
45    }
46}
47
48impl fmt::Display for PeerID {
49    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50        f.write_str(&BASE64_URL_SAFE_NO_PAD.encode(self.0.to_bytes()))
51    }
52}
53
54impl Serialize for PeerID {
55    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
56        serializer.serialize_str(&BASE64_URL_SAFE_NO_PAD.encode(self.0.to_bytes()))
57    }
58}
59
60impl<'de> Deserialize<'de> for PeerID {
61    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
62        let s: &str = Deserialize::deserialize(deserializer)?;
63        let bytes = BASE64_URL_SAFE_NO_PAD
64            .decode(s)
65            .map_err(serde::de::Error::custom)?;
66        PublicKey::from_bytes(&bytes, Algorithm::Ed25519)
67            .map(Self)
68            .map_err(serde::de::Error::custom)
69    }
70}