use indexmap::IndexMap;
use mumu::parser::types::Value;
use super::proto::DiscoveryProtocol;
#[derive(Clone, Debug)]
pub struct LldpRow {
pub interface: String,
pub protocol: DiscoveryProtocol,
pub chassis_id: String,
pub port_id: String,
pub system_name: Option<String>,
pub system_desc: Option<String>,
pub port_desc: Option<String>,
pub vlan: Option<String>,
pub management_ip: Option<String>,
pub capabilities: Vec<String>,
pub ttl: Option<u16>,
pub timestamp_ms: u64,
}
impl LldpRow {
pub fn to_value(&self) -> Value {
let mut m: IndexMap<String, Value> = IndexMap::new();
m.insert("iface".into(), Value::SingleString(self.interface.clone()));
m.insert(
"protocol".into(),
Value::SingleString(self.protocol.as_str().to_string()),
);
m.insert("chassis_id".into(), Value::SingleString(self.chassis_id.clone()));
m.insert("port_id".into(), Value::SingleString(self.port_id.clone()));
if let Some(s) = &self.system_name {
m.insert("system_name".into(), Value::SingleString(s.clone()));
}
if let Some(s) = &self.system_desc {
m.insert("system_desc".into(), Value::SingleString(s.clone()));
}
if let Some(s) = &self.port_desc {
m.insert("port_desc".into(), Value::SingleString(s.clone()));
}
if let Some(v) = &self.vlan {
m.insert("vlan".into(), Value::SingleString(v.clone()));
}
if let Some(ip) = &self.management_ip {
m.insert("management_ip".into(), Value::SingleString(ip.clone()));
}
if !self.capabilities.is_empty() {
m.insert(
"capabilities".into(),
Value::StrArray(self.capabilities.clone()),
);
}
if let Some(ttl) = self.ttl {
m.insert("ttl".into(), Value::Int(ttl as i32));
}
m.insert("timestamp_ms".into(), Value::Long(self.timestamp_ms as i64));
Value::KeyedArray(m)
}
}