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}