From a8318210265a2570e0ffb3896d5999c926e9a1af Mon Sep 17 00:00:00 2001 From: Bastian Gruber Date: Sun, 21 May 2023 17:58:51 +0200 Subject: [PATCH] Send out stale tickets --- problem_06/src/db.rs | 5 +++++ problem_06/src/server.rs | 3 ++- problem_06/src/ticketing.rs | 12 +++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/problem_06/src/db.rs b/problem_06/src/db.rs index 3746e6c..fabdf2c 100644 --- a/problem_06/src/db.rs +++ b/problem_06/src/db.rs @@ -155,6 +155,11 @@ impl Db { .push(ticket); } + pub(crate) fn get_open_tickets(&self) -> Vec { + let state = self.state.lock().unwrap(); + state.open_tickets.values().flatten().cloned().collect() + } + pub(crate) fn get_plates_by_road( &self, plate: Plate, diff --git a/problem_06/src/server.rs b/problem_06/src/server.rs index 36897e5..4a9d2eb 100644 --- a/problem_06/src/server.rs +++ b/problem_06/src/server.rs @@ -12,7 +12,7 @@ use crate::{ db::{Camera, CameraId, Db, DbHolder, DispatcherId, Limit, Mile, Plate, Road, Timestamp}, frame::{ClientFrames, ServerFrames}, heartbeat::Heartbeat, - ticketing::issue_possible_ticket, + ticketing::{issue_possible_ticket, send_out_waiting_tickets}, Connection, Shutdown, }; @@ -240,6 +240,7 @@ impl Handler { roads.to_vec(), send_message.clone(), ); + send_out_waiting_tickets(db).await; } } diff --git a/problem_06/src/ticketing.rs b/problem_06/src/ticketing.rs index fe16752..3ec5426 100644 --- a/problem_06/src/ticketing.rs +++ b/problem_06/src/ticketing.rs @@ -1,4 +1,4 @@ -use crate::db::{CameraId, Db, Plate, Ticket}; +use crate::db::{CameraId, Db, Plate, Road, Ticket}; pub(crate) async fn issue_possible_ticket(db: &mut Db, plate: Plate, camera_id: CameraId) { let camera = db.get_camera(camera_id).unwrap(); @@ -60,3 +60,13 @@ pub(crate) async fn issue_possible_ticket(db: &mut Db, plate: Plate, camera_id: } } } + +pub(crate) async fn send_out_waiting_tickets(db: Db) { + let tickets = db.get_open_tickets(); + + for ticket in tickets { + if let Some(dispatcher) = db.get_dispatcher_for_road(Road(ticket.road)) { + let _ = dispatcher.send(ticket.into()).await; + } + } +}