use serde::{Deserialize, Serialize};
use zlink::{proxy, ReplyError};
pub const NETWORK_SOCKET_PATH: &str = "/run/systemd/netif/io.systemd.Network";
#[proxy("io.systemd.Network")]
pub trait Network {
async fn describe(&mut self) -> zlink::Result<Result<DescribeOutput, NetworkError>>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DescribeOutput {
#[serde(rename = "Interfaces")]
pub interfaces: Option<Vec<Interface>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Interface {
#[serde(rename = "Index")]
pub index: i64,
#[serde(rename = "Name")]
pub name: String,
#[serde(rename = "AdministrativeState")]
pub administrative_state: String,
#[serde(rename = "OperationalState")]
pub operational_state: String,
#[serde(rename = "CarrierState")]
pub carrier_state: String,
#[serde(rename = "AddressState")]
pub address_state: String,
#[serde(rename = "IPv4AddressState")]
pub ipv4_address_state: String,
#[serde(rename = "IPv6AddressState")]
pub ipv6_address_state: String,
#[serde(rename = "OnlineState")]
pub online_state: Option<String>,
#[serde(rename = "NetworkFile")]
pub network_file: Option<String>,
#[serde(rename = "RequiredForOnline")]
pub required_for_online: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, ReplyError)]
#[zlink(interface = "io.systemd.Network")]
pub enum NetworkError {
NoSuchInterface,
}
impl std::fmt::Display for NetworkError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
NetworkError::NoSuchInterface => write!(f, "No such interface"),
}
}
}
impl std::error::Error for NetworkError {}