use std::net::IpAddr;
#[derive(Debug, PartialEq, Eq, pyo3::IntoPyObject)]
pub struct NodeInfo {
pub id: i64,
pub stable_id: String,
pub hostname: String,
pub tailnet: Option<String>,
pub tags: Vec<String>,
pub tailnet_addresses: Vec<IpAddr>,
pub derp_region: Option<u32>,
pub node_key: Vec<u8>,
pub disco_key: Option<Vec<u8>>,
pub machine_key: Option<Vec<u8>>,
pub underlay_addresses: Vec<(IpAddr, u16)>,
}
impl From<&tailscale::NodeInfo> for NodeInfo {
fn from(value: &tailscale::NodeInfo) -> Self {
Self {
id: value.id,
stable_id: value.stable_id.0.clone(),
tags: value.tags.clone(),
node_key: value.node_key.to_bytes().to_vec(),
hostname: value.hostname.clone(),
tailnet: value.tailnet.clone(),
tailnet_addresses: vec![
value.tailnet_address.ipv4.addr().into(),
value.tailnet_address.ipv6.addr().into(),
],
derp_region: value.derp_region.map(|x| x.0.get()),
machine_key: value.machine_key.as_ref().map(|x| x.to_bytes().to_vec()),
disco_key: value.disco_key.as_ref().map(|x| x.to_bytes().to_vec()),
underlay_addresses: value
.underlay_addresses
.iter()
.map(|addr| (addr.ip(), addr.port()))
.collect(),
}
}
}