confitul 0.1.4

ConfitUL contains utilities for ConfitDB which is an experimental, distributed, real-time database, giving full control on conflict resolution.
Documentation
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)
    }
}