POC in Rust save again only on change db and dont delete racers after leave

This commit is contained in:
Martin Quarda 2025-05-13 15:56:12 +02:00
parent 6aeb5e1c2a
commit bf531b477f

View File

@ -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::<Local>) -> 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();