gistools/readers/gtfs/schedule/fare_rules.rs
1use crate::readers::csv::parse_csv_as_record;
2use alloc::{string::String, vec::Vec};
3use s2json::MValueCompatible;
4
5/// # Fare Rules
6///
7/// **Optional**
8/// Defines how fares in `fare_attributes.txt` apply to an itinerary.
9/// For more complex fare structures, multiple combinations of fields
10/// (route, origin, destination, zones) can be used.
11#[derive(Debug, Default, Clone, PartialEq, MValueCompatible)]
12pub struct GTFSFareRule {
13 /// **Required**
14 /// Identifies a fare class (`fare_attributes.fare_id`).
15 pub fare_id: String,
16 /// **Optional**
17 /// Route associated with this fare. If multiple routes share the same fare,
18 /// add multiple records in `fare_rules.txt`.
19 pub route_id: Option<String>,
20 /// **Optional**
21 /// Origin zone (`stops.zone_id`). If a fare class applies to multiple origin zones,
22 /// each zone requires its own record.
23 pub origin_id: Option<String>,
24 /// **Optional**
25 /// Destination zone (`stops.zone_id`). If a fare class applies to multiple destination zones,
26 /// each zone requires its own record.
27 pub destination_id: Option<String>,
28 /// **Optional**
29 /// All zones traveled during the trip using this fare class.
30 /// If multiple zones must be passed, each is listed separately.
31 pub contains_id: Option<String>,
32}
33impl GTFSFareRule {
34 /// Create a new GTFSFareRule
35 pub fn new(source: &str) -> Vec<GTFSFareRule> {
36 let mut res = Vec::new();
37 for record in parse_csv_as_record::<GTFSFareRule>(source, None, None) {
38 res.push(record);
39 }
40 res
41 }
42}