From 707aecdba76c3f62cfc45d3bca43dddaf94c1abf Mon Sep 17 00:00:00 2001 From: Nahuel Lofeudo Date: Tue, 21 Apr 2026 08:32:49 +0100 Subject: [PATCH] Made GFS code into an ADT --- src/gtfs/loader.rs | 2 +- src/gtfs/mod.rs | 58 ++++++++++++++++++++++++++++++++------------- src/gtfs/structs.rs | 23 ++---------------- src/gtfs/utils.rs | 3 +-- src/main.rs | 4 ++-- 5 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/gtfs/loader.rs b/src/gtfs/loader.rs index 4632fd0..535298c 100644 --- a/src/gtfs/loader.rs +++ b/src/gtfs/loader.rs @@ -8,7 +8,7 @@ use std::{ use zip::ZipArchive; use crate::gtfs::{ - structs::Gtfs, + Gtfs, utils::{route_ids_from_numbers, stop_ids_from_codes}, }; diff --git a/src/gtfs/mod.rs b/src/gtfs/mod.rs index 96855bc..40b8475 100644 --- a/src/gtfs/mod.rs +++ b/src/gtfs/mod.rs @@ -5,31 +5,57 @@ use std::{ collections::{HashMap}, fs::File, }; -use crate::gtfs::{loader::load_gtfs, structs::{Arrival, Gtfs, Preferences}}; +use gtfs_structures::{Agency, Calendar, CalendarDate, RawStopTime, RawTrip, Route, Stop, TimepointType}; -pub fn _get_next_stops(_gtfs: &Gtfs) -> Vec> { - let arrivals = Vec::::new(); +use crate::gtfs::{loader::load_gtfs, structs::{Arrival, Preferences}}; + +// The main GTFS struct. This is similar to (but not exactly) gtfs-structures::Gtfs because we don't need everything +#[derive(Debug)] +pub struct Gtfs { + /// All agencies. They can not be read by `agency_id`, as it is not a required field + pub agencies: Vec, + /// All Calendar by `service_id` + pub calendar: HashMap, + /// All calendar dates grouped by service_id + pub calendar_dates: HashMap>, + /// All routes by `route_id` + pub routes: HashMap, + /// All stop by `stop_id`. + pub stops: HashMap, + /// All trips by trip_id + pub trips: HashMap, + /// Stop times for the chosen stops and the chosen routes + pub stop_times: HashMap<(String, u32), RawStopTime>, +} + + +impl Gtfs { + + pub fn _get_next_stops(&self) -> Vec> { + let arrivals = Vec::::new(); return arrivals; } -/// Load a GTFS structure from a zip file -pub fn load(src_file: &str, prefs: &Preferences) -> Gtfs { - // Open zip file - let mut zip_reader = zip::ZipArchive::new(File::open(src_file).unwrap()).unwrap(); + /// Load a GTFS structure from a zip file + pub fn load(src_file: &str, prefs: &Preferences) -> Gtfs { + // Open zip file + let mut zip_reader = zip::ZipArchive::new(File::open(src_file).unwrap()).unwrap(); - let mut gtfs: Gtfs = Gtfs { - agencies: Vec::new(), - calendar: HashMap::new(), - calendar_dates: HashMap::new(), - routes: HashMap::new(), - stops: HashMap::new(), - trips: HashMap::new(), - stop_times: HashMap::new(), - }; + let mut gtfs: Gtfs = Gtfs { + agencies: Vec::new(), + calendar: HashMap::new(), + calendar_dates: HashMap::new(), + routes: HashMap::new(), + stops: HashMap::new(), + trips: HashMap::new(), + stop_times: HashMap::new(), + }; load_gtfs(&mut gtfs, &mut zip_reader, &prefs.route_numbers, &prefs.stop_codes); return gtfs; +} + } \ No newline at end of file diff --git a/src/gtfs/structs.rs b/src/gtfs/structs.rs index 6279126..dec0987 100644 --- a/src/gtfs/structs.rs +++ b/src/gtfs/structs.rs @@ -1,6 +1,6 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::{HashSet}; -use gtfs_structures::{Agency, Calendar, CalendarDate, RawStopTime, RawTrip, Route, Stop, TimepointType}; +use gtfs_structures::{TimepointType, Route, Stop}; // This is to store the preferences for the GTFS(-R) side of the code. pub struct Preferences { @@ -9,25 +9,6 @@ pub struct Preferences { } -// The main GTFS struct. This is similar to (but not exactly) gtfs-structures::Gtfs because we don't need everything -#[derive(Debug)] -pub struct Gtfs { - /// All agencies. They can not be read by `agency_id`, as it is not a required field - pub agencies: Vec, - /// All Calendar by `service_id` - pub calendar: HashMap, - /// All calendar dates grouped by service_id - pub calendar_dates: HashMap>, - /// All routes by `route_id` - pub routes: HashMap, - /// All stop by `stop_id`. - pub stops: HashMap, - /// All trips by trip_id - pub trips: HashMap, - /// Stop times for the chosen stops and the chosen routes - pub stop_times: HashMap<(String, u32), RawStopTime>, -} - pub struct Arrival<'a> { pub route: &'a Route, pub stop: &'a Stop, diff --git a/src/gtfs/utils.rs b/src/gtfs/utils.rs index 22d86dd..602406b 100644 --- a/src/gtfs/utils.rs +++ b/src/gtfs/utils.rs @@ -1,6 +1,5 @@ use std::collections::HashSet; -use crate::gtfs::structs::Gtfs; - +use crate::gtfs::Gtfs; pub fn stop_ids_from_codes(gtfs: &Gtfs, stop_codes: &HashSet) -> HashSet { let mut ids: HashSet = HashSet::new(); diff --git a/src/main.rs b/src/main.rs index 9298934..2fd8100 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ use std::{collections::HashSet, thread, time::Duration}; use sdl3::event::{self, Event, EventWatchCallback}; -use crate::renderer::Screen; +use crate::{gtfs::Gtfs, renderer::Screen}; const SRC_FILE: &str = "/home/nahuel/Downloads/GTFS_Realtime.zip"; @@ -33,7 +33,7 @@ fn main() { // Init GTFS static info println!("Loading GTFS data..."); - //let _gtfs = gtfs::load(SRC_FILE, >fs_prefs); + //let _gtfs = Gtfs::load(SRC_FILE, >fs_prefs); // Init screen println!("Initializing screen...");