From e8a97c557b79be528de66f9c8e39f21f7d41527d Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Tue, 10 Oct 2023 18:36:27 -0700 Subject: [PATCH 1/1] server: Denormalized Message Oh, wow, implementing deserialization in serde by hand is painful. This hurts less. --- server/Cargo.toml | 2 +- server/src/main.rs | 40 ++++++++++++++++++---------------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/server/Cargo.toml b/server/Cargo.toml index 01a4b3f..9fbdf1f 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -12,4 +12,4 @@ version = "0.0.1" [dependencies] csv = "1.3.0" -serde = "1.0" +serde = { version = "1.0", features = ["derive"] } diff --git a/server/src/main.rs b/server/src/main.rs index 500c2f5..9406811 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use serde::ser::{Serialize, SerializeStruct, Serializer}; +use serde::Serialize; use std::collections::HashMap; use std::net::UdpSocket; use std::time::{Duration, SystemTime, UNIX_EPOCH}; @@ -29,23 +29,20 @@ struct MessageKey { seq: u16, } -#[derive(Debug)] +#[derive(Debug, Serialize)] struct Message { - key: MessageKey, + epoch: u32, + device: u16, + seq: u16, t: u64, } -impl Serialize for Message { - // https://github.com/BurntSushi/rust-csv/issues/155 - // https://github.com/BurntSushi/rust-csv/issues/98 - // https://github.com/BurntSushi/rust-csv/pull/223 - // csv doesn't support #[serde(flatten)], so we implement this directly. :( - fn serialize(&self, serializer: S) -> Result { - let mut row = serializer.serialize_struct("Message", 4)?; - row.serialize_field("epoch", &self.key.epoch)?; - row.serialize_field("device", &self.key.device)?; - row.serialize_field("seq", &self.key.seq)?; - row.serialize_field("t", &self.t)?; - row.end() +impl Message { + fn key(&self) -> MessageKey { + MessageKey { + epoch: self.epoch, + device: self.device, + seq: self.seq, + } } } @@ -54,11 +51,9 @@ impl From<&[u8; MESSAGE_SIZE]> for Message { let ago = u32::from_be_bytes(value[8..=11].try_into().expect("I can't count")); let press_time = SystemTime::now() - Duration::new(ago.into(), 0); Self { - key: MessageKey { - epoch: u32::from_be_bytes(value[0..=3].try_into().expect("I can't count")), - device: u16::from_be_bytes(value[4..=5].try_into().expect("I can't count")), - seq: u16::from_be_bytes(value[6..=7].try_into().expect("I can't count")), - }, + epoch: u32::from_be_bytes(value[0..=3].try_into().expect("I can't count")), + device: u16::from_be_bytes(value[4..=5].try_into().expect("I can't count")), + seq: u16::from_be_bytes(value[6..=7].try_into().expect("I can't count")), t: press_time .duration_since(UNIX_EPOCH) .expect("Bad time?") @@ -99,12 +94,13 @@ impl Range { } fn merge_message(presses: &mut HashMap, message: Message) { - if let Some(r) = presses.get_mut(&message.key) { + let key = message.key(); + if let Some(r) = presses.get_mut(&key) { if !r.contains(&message.t) { r.extend(&message.t); } } else { - presses.insert(message.key, Range::new(&message.t)); + presses.insert(key, Range::new(&message.t)); } } -- 2.44.1