diff --git a/src/ports.rs b/src/ports.rs index 0baa3d7..1260c0d 100644 --- a/src/ports.rs +++ b/src/ports.rs @@ -112,17 +112,32 @@ impl Debug for DisplayAsDebug { #[derive(Default, Serialize, Deserialize)] pub struct PortState { + #[serde(deserialize_with = "deserialize_last_change")] last_change: UnixTimestamp, #[serde(skip_deserializing)] status: PortStatus, } +fn deserialize_last_change<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + Ok(match Option::::deserialize(deserializer)? { + Some(timestamp) => timestamp, + None => now(), + }) +} + +fn now() -> UnixTimestamp { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("timestamp overflow") + .as_secs() +} + impl PortState { pub fn new_state(&mut self, status: PortStatus) { - self.last_change = SystemTime::now() - .duration_since(UNIX_EPOCH) - .expect("timestamp overflow") - .as_secs(); + self.last_change = now(); self.status = status; } @@ -187,7 +202,15 @@ impl PortHandler { .unwrap() .values_mut() .for_each(|value| { - value.as_object_mut().unwrap().remove("status").unwrap(); + let value_object = value.as_object_mut().unwrap(); + + // it does not make sense to store when the did anything else other than disconnect + // because when we restart the server it will no longer be connected + if value_object.get("status").unwrap().as_str().unwrap() != "disconnected" { + *value_object.get_mut("last_change").unwrap() = serde_json::Value::Null; + } + + value_object.remove("status").unwrap(); }); serde_json::to_writer(BufWriter::new(File::create(&temp_file)?), &value)?;