use crate::cspcl_sys;
use crate::error::{Error, Result};
use std::ffi::CString;
pub fn endpoint_to_addr(endpoint: &str) -> Option<u8> {
let c_str = CString::new(endpoint).ok()?;
let addr = unsafe { cspcl_sys::cspcl_endpoint_to_addr(c_str.as_ptr()) };
if addr == 0 { None } else { Some(addr) }
}
pub fn addr_to_endpoint(addr: u8) -> Result<String> {
let mut buffer = [0u8; 32];
unsafe {
Error::from_code(cspcl_sys::cspcl_addr_to_endpoint(
addr,
buffer.as_mut_ptr() as *mut i8,
buffer.len(),
))?;
}
Ok(String::from_utf8_lossy(&buffer)
.trim_matches('\0')
.to_string())
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct RemotePeer {
pub addr: u8,
pub port: u8,
}
impl RemotePeer {
pub fn new(addr: u8, port: u8) -> Self {
Self { addr, port }
}
pub fn from_endpoint(endpoint: &str, port: u8) -> Option<Self> {
endpoint_to_addr(endpoint).map(|addr| Self { addr, port })
}
pub fn endpoint(&self) -> crate::Result<String> {
addr_to_endpoint(self.addr)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_endpoint_conversion() {
let endpoint = "ipn:1.0";
if let Some(addr) = endpoint_to_addr(endpoint) {
assert_eq!(addr, 1);
}
}
}