error handling, coderabbit

This commit is contained in:
lda
2026-05-03 15:39:10 +07:00 Verified
parent 155458791e
commit 3f8abc1571
33 changed files with 393 additions and 298 deletions
+3 -31
View File
@@ -11,7 +11,7 @@ use crate::parse::mac;
/// Variant order defines `Ord`: Offline < Unknown < LikelyOnline < Online.
/// `std::cmp::max` picks the most-online signal when merging.
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, Ord, PartialOrd, Serialize, serde::Deserialize, Default,
Debug, PartialEq, Eq, Clone, Copy, Hash, Ord, PartialOrd, Serialize, Deserialize, Default,
)]
#[serde(rename_all = "snake_case")]
pub enum Presence {
@@ -143,11 +143,7 @@ impl Device {
if let Some(dev) = neighbor.dev.as_deref() {
interfaces.insert(dev);
}
presence = std::cmp::max(
presence_rank(presence),
presence_rank(neighbor.state.into()),
)
.into();
presence = std::cmp::max(presence, Presence::from(neighbor.state));
}
let mut observed_non_remove = false;
for observation in &observations {
@@ -163,11 +159,7 @@ impl Device {
if observation.action != "remove" {
observed_non_remove = true;
}
presence = std::cmp::max(
presence_rank(presence),
presence_rank(observation_presence(observation)),
)
.into();
presence = std::cmp::max(presence, observation_presence(observation));
}
if neighbors.is_empty()
@@ -207,26 +199,6 @@ fn observation_presence(observation: &DeviceObservationFact) -> Presence {
}
}
const fn presence_rank(presence: Presence) -> u8 {
match presence {
Presence::Online => 3,
Presence::LikelyOnline => 2,
Presence::Unknown => 1,
Presence::Offline => 0,
}
}
impl From<u8> for Presence {
fn from(value: u8) -> Self {
match value {
3 => Self::Online,
2 => Self::LikelyOnline,
0 => Self::Offline,
_ => Self::Unknown,
}
}
}
/// Collection of merged discovered devices.
#[derive(Debug, Default, Clone, Serialize)]
pub struct DeviceInventory {
+10 -2
View File
@@ -138,21 +138,29 @@ mod test {
use super::*;
#[test]
fn deserialize_online_neighbor() {
NeighborEntry::deserialize(serde_json::json!({
let entry = NeighborEntry::deserialize(serde_json::json!({
"ip" : "192.168.100.94",
"dev" : "br-lan",
"mac" : "04:7C:16:79:6D:EE",
"state" : "REACHABLE"
}))
.expect("all fields must pass");
assert_eq!(entry.ip, IpAddr::from([192, 168, 100, 94]));
assert_eq!(entry.dev, Some("br-lan".to_string()));
assert_eq!(entry.mac, Some("04:7c:16:79:6d:ee".parse().expect("mac")));
assert_eq!(entry.state, NeighborState::Reachable);
}
#[test]
fn deserialize_failed_neighbor() {
NeighborEntry::deserialize(serde_json::json!({
let entry = NeighborEntry::deserialize(serde_json::json!({
"ip" : "192.168.100.94",
"dev" : "br-lan",
"state" : "FAILED"
}))
.expect("default");
assert_eq!(entry.ip, IpAddr::from([192, 168, 100, 94]));
assert_eq!(entry.dev, Some("br-lan".to_string()));
assert_eq!(entry.mac, None);
assert_eq!(entry.state, NeighborState::Failed);
}
}