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}