gatelogue_types/node/
bus.rs

1use strum_macros::EnumString;
2
3use crate::{from_sql_for_enum, get_column, get_derived_vec, get_set, node_type, util::ID};
4
5#[derive(Clone, Copy, PartialEq, Eq, Debug, EnumString)]
6pub enum BusMode {
7    #[strum(serialize = "warp")]
8    Warp,
9    #[strum(serialize = "traincarts")]
10    TrainCarts,
11}
12from_sql_for_enum!(BusMode);
13
14node_type!(BusCompany);
15impl BusCompany {
16    get_column!("BusCompany", name, String);
17    get_column!("BusCompany", link, Option<String>);
18    get_derived_vec!(lines, BusLine, "SELECT i FROM BusLine WHERE company = ?");
19    get_derived_vec!(stops, BusStop, "SELECT i FROM BusStop WHERE company = ?");
20    get_derived_vec!(
21        berths,
22        BusBerth,
23        concat!(
24            "SELECT DISTINCT BusBerth.i ",
25            "FROM (SELECT i FROM BusStop WHERE company = ?) A ",
26            "INNER JOIN BusBerth on A.i = BusBerth.stop"
27        )
28    );
29}
30
31node_type!(BusLine);
32impl BusLine {
33    get_column!("BusLine", code, String);
34    get_column!("BusLine", company, BusCompany);
35    get_column!("BusLine", name, Option<String>);
36    get_column!("BusLine", colour, Option<String>);
37    get_column!("BusLine", mode, Option<BusMode>);
38    get_column!("BusLine", local, Option<bool>);
39
40    get_derived_vec!(
41        berths,
42        BusBerth,
43        concat!(
44            "SELECT DISTINCT BusBerth.i ",
45            "FROM (SELECT \"from\", \"to\" FROM BusConnection WHERE line = ?) A ",
46            "LEFT JOIN BusBerth ON A.\"from\" = BusBerth.i OR A.\"to\" = BusBerth.i"
47        )
48    );
49    get_derived_vec!(
50        stops,
51        BusStop,
52        concat!(
53            "SELECT DISTINCT BusBerth.stop ",
54            "FROM (SELECT \"from\", \"to\" FROM BusConnection WHERE line = ?) A ",
55            "LEFT JOIN BusBerth ON A.\"from\" = BusBerth.i OR A.\"to\" = BusBerth.i"
56        )
57    );
58}
59
60node_type!(located BusStop);
61impl BusStop {
62    get_set!("BusStopCodes", codes, "code", String);
63    get_column!("BusStop", company, BusCompany);
64    get_column!("BusStop", name, Option<String>);
65
66    get_derived_vec!(berths, BusBerth, "SELECT i FROM BusBerth WHERE stop = ?");
67    get_derived_vec!(
68        connections_from_here,
69        BusConnection,
70        concat!(
71            "SELECT DISTINCT BusConnection.i ",
72            "FROM (SELECT i FROM BusBerth WHERE stop = ?) A ",
73            "INNER JOIN BusConnection ON A.i = BusConnection.\"from\""
74        )
75    );
76    get_derived_vec!(
77        connections_to_here,
78        BusConnection,
79        concat!(
80            "SELECT DISTINCT BusConnection.i ",
81            "FROM (SELECT i FROM BusBerth WHERE stop = ?) A ",
82            "INNER JOIN BusConnection ON A.i = BusConnection.\"to\""
83        )
84    );
85    get_derived_vec!(
86        lines,
87        BusLine,
88        concat!(
89            "SELECT DISTINCT BusConnection.line ",
90            "FROM (SELECT i FROM BusBerth WHERE stop = ?) A ",
91            "LEFT JOIN BusConnection ON A.i = BusConnection.\"from\" OR A.i = BusConnection.\"to\""
92        )
93    );
94}
95
96node_type!(BusBerth);
97impl BusBerth {
98    get_column!("BusBerth", code, Option<String>);
99    get_column!("BusBerth", stop, BusStop);
100
101    get_derived_vec!(
102        connections_from_here,
103        BusConnection,
104        "SELECT BusConnection.i FROM BusConnection WHERE BusConnection.\"from\" = ?"
105    );
106    get_derived_vec!(
107        connections_to_here,
108        BusConnection,
109        "SELECT BusConnection.i FROM BusConnection WHERE BusConnection.\"to\" = ?"
110    );
111    get_derived_vec!(
112        lines,
113        BusLine,
114        concat!(
115            "SELECT DISTINCT BusConnection.line FROM BusConnection ",
116            "WHERE BusConnection.\"from\" = ? OR BusConnection.\"to\" = ?"
117        )
118    );
119}
120
121node_type!(BusConnection);
122impl BusConnection {
123    get_column!("BusConnection", line, BusLine);
124    get_column!("BusConnection", from, BusBerth);
125    get_column!("BusConnection", to, BusBerth);
126    get_column!("BusConnection", direction, Option<String>);
127    get_column!("BusConnection", duration, Option<u32>);
128}