From bf531b477f255d1072bc7aaa0fe612b202a0e4c0 Mon Sep 17 00:00:00 2001 From: Martin Quarda Date: Tue, 13 May 2025 15:56:12 +0200 Subject: [PATCH] POC in Rust save again only on change db and dont delete racers after leave --- POC_in_rust/src/main.rs | 68 ++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/POC_in_rust/src/main.rs b/POC_in_rust/src/main.rs index 00544ae..3b4798a 100644 --- a/POC_in_rust/src/main.rs +++ b/POC_in_rust/src/main.rs @@ -37,7 +37,7 @@ struct State{ impl Default for State { fn default() -> Self { Self { - racers: vec![RacerTime{time: Instant::now(), racer: Racer{starting_number:11, card_id: 0}}], + racers: vec![], db: Default::default(), time: Instant::now(), } @@ -57,6 +57,26 @@ struct RegisterRacer{ station_id: usize, } +#[derive(Serialize, Deserialize, Clone, Eq, PartialEq)] +struct Racer{ + starting_number: usize, + card_id: usize, +} + +enum Message{ + CardReader(card_reader::Event), + RacerRecieved(db_update::Event), + Tick(Instant), + Nothing, +} + +impl std::fmt::Debug for Message { + // Required method + fn fmt(&self, _f: &mut Formatter<'_>) -> Result<(), fmtError>{ + todo!() + } +} + async fn station_register(card_id: usize, time: DateTime::) -> Result<(), reqwest::Error>{ let register_racer = RegisterRacer{ card_id: card_id, @@ -83,18 +103,17 @@ impl State{ match event { db_update::Event::MessageReceived(s) => { let racer: Racer = serde_json::from_str(s.as_str()).unwrap(); - self.db.insert(racer.card_id, racer); + let old_racer = self.db.insert(racer.card_id, racer.clone()); + if old_racer != Some(racer){ + let json = serde_json::to_string(self).unwrap(); + Task::perform(dump_state(json), |_| Message::Nothing) + }else{ + Task::none() + } }, - }; - let json = serde_json::to_string(self).unwrap(); - Task::perform(dump_state(json), |_| Message::Nothing) + } } Message::Tick(time) => { - if let Some(racer_time) = self.racers.iter().next() { - if time - racer_time.time > Duration::new(CONFIG.DURATION + 10, 0){ - self.racers.remove(0); - } - } self.time = time; Task::none() }, @@ -103,7 +122,7 @@ impl State{ let time = Instant::now(); let datetime = Local::now(); if let Some(racer) = self.db.get(&card_id){ - if !self.racers.iter().any(|rt| rt.racer.card_id == card_id){ + if !self.racers.iter().any(|rt| rt.racer.starting_number == racer.starting_number){ let racer_time = RacerTime{time, racer: racer.clone()}; self.racers.push(racer_time); } @@ -140,10 +159,12 @@ impl State{ } else { (duration - time, false) }; - - let seconds = duration.as_secs(); + if negative && seconds >= 10 { + continue + } + let duration = text!( "{}{:0>2}:{:0>2}.{:0>2}", if negative {"-"} else {""}, @@ -171,27 +192,6 @@ impl State{ } } -#[derive(Serialize, Deserialize, Clone)] -struct Racer{ - starting_number: usize, - card_id: usize, -} - -enum Message{ - CardReader(card_reader::Event), - RacerRecieved(db_update::Event), - Tick(Instant), - Nothing, -} - -impl std::fmt::Debug for Message { - // Required method - fn fmt(&self, _f: &mut Formatter<'_>) -> Result<(), fmtError>{ - todo!() - } -} - - pub fn main() -> iced::Result { let init_state = || -> State {read_to_string("state.json").ok().map(|s| serde_json::from_str(&s).ok()).flatten().unwrap_or_else(||Default::default())} ; env_logger::init();