use libp2p::{identity::PublicKey, Multiaddr};
use pchain_types::cryptography::PublicAddress;
use std::net::Ipv4Addr;
pub fn base64_string<T: AsRef<[u8]>>(bytes: T) -> String {
base64url::encode(bytes)
}
pub fn public_address(public_key: &PublicKey) -> Option<PublicAddress> {
match public_key.clone().try_into_ed25519() {
Ok(kp) => Some(kp.to_bytes()),
_=> None
}
}
pub fn multiaddr(ip_address: Ipv4Addr, port: u16) -> Multiaddr {
format!("/ip4/{}/tcp/{}", ip_address, port).parse().unwrap()
}
#[cfg(test)]
mod test {
use super::*;
use libp2p::identity::Keypair;
#[test]
fn test_base64_string() {
let test_keypair = Keypair::generate_ed25519();
let test_keypair_bytes = test_keypair.public().to_peer_id().to_bytes();
let result = base64_string(&test_keypair_bytes);
assert_eq!(result.len(), 51)
}
#[test]
fn test_public_address_conversion() {
let test_keypair = Keypair::generate_ed25519();
let test_keypair_public = test_keypair.public();
let result = public_address(&test_keypair_public);
assert_eq!(result.is_some(), true);
assert_eq!(result.unwrap().len(), 32);
}
#[test]
fn test_create_multiaddress() {
let test_ip = Ipv4Addr::new(127, 0, 0, 1);
let test_port = 4;
let result = multiaddr(test_ip, test_port);
let expected_result: String = String::from("/ip4/127.0.0.1/tcp/4");
assert_eq!(result.to_string(), expected_result);
}
}