use ed25519_dalek;
use hex::ToHex;
use serde::{Deserialize, Serialize};
use std::convert::TryFrom;
use std::fmt::Formatter;
pub const HOST_ID_STR_LEN: usize = 9;
pub const HOST_ID_LEN: usize = ed25519_dalek::PUBLIC_KEY_LENGTH;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct HostId {
value: [u8; HOST_ID_LEN],
}
impl HostId {
pub fn new(key: &ed25519_dalek::Keypair) -> HostId {
HostId {
value: <[u8; HOST_ID_LEN]>::try_from(key.public.to_bytes())
.expect("wrong signature size"),
}
}
}
impl From<HostId> for String {
fn from(id: HostId) -> String {
format!("{}", id)
}
}
impl TryFrom<HostId> for ed25519_dalek::PublicKey {
type Error = signature::Error;
fn try_from(id: HostId) -> Result<ed25519_dalek::PublicKey, signature::Error> {
ed25519_dalek::PublicKey::from_bytes(&id.value)
}
}
impl std::fmt::Display for HostId {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let mut s: String = self.value.encode_hex();
if s.len() > HOST_ID_STR_LEN {
s = s[..HOST_ID_STR_LEN].to_string();
}
write!(f, "0x{}", s)
}
}