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 SeaMode {
7 #[strum(serialize = "cruise")]
8 Cruise,
9 #[strum(serialize = "warp ferry")]
10 WarpFerry,
11 #[strum(serialize = "traincarts ferry")]
12 TrainCartsFerry,
13}
14from_sql_for_enum!(SeaMode);
15
16node_type!(SeaCompany);
17impl SeaCompany {
18 get_column!("SeaCompany", name, String);
19 get_column!("SeaCompany", link, Option<String>);
20 get_derived_vec!(lines, SeaLine, "SELECT i FROM SeaLine WHERE company = ?");
21 get_derived_vec!(stops, SeaStop, "SELECT i FROM SeaStop WHERE company = ?");
22 get_derived_vec!(
23 docks,
24 SeaDock,
25 concat!(
26 "SELECT DISTINCT SeaDock.i ",
27 "FROM (SELECT i FROM SeaStop WHERE company = ?) A ",
28 "INNER JOIN SeaDock on A.i = SeaDock.stop"
29 )
30 );
31}
32
33node_type!(SeaLine);
34impl SeaLine {
35 get_column!("SeaLine", code, String);
36 get_column!("SeaLine", company, SeaCompany);
37 get_column!("SeaLine", name, Option<String>);
38 get_column!("SeaLine", colour, Option<String>);
39 get_column!("SeaLine", mode, Option<SeaMode>);
40 get_column!("SeaLine", local, Option<bool>);
41
42 get_derived_vec!(
43 docks,
44 SeaDock,
45 concat!(
46 "SELECT DISTINCT SeaDock.i ",
47 "FROM (SELECT \"from\", \"to\" FROM SeaConnection WHERE line = ?) A ",
48 "LEFT JOIN SeaDock ON A.\"from\" = SeaDock.i OR A.\"to\" = SeaDock.i"
49 )
50 );
51 get_derived_vec!(
52 stops,
53 SeaStop,
54 concat!(
55 "SELECT DISTINCT SeaDock.stop ",
56 "FROM (SELECT \"from\", \"to\" FROM SeaConnection WHERE line = ?) A ",
57 "LEFT JOIN SeaDock ON A.\"from\" = SeaDock.i OR A.\"to\" = SeaDock.i"
58 )
59 );
60}
61
62node_type!(located SeaStop);
63impl SeaStop {
64 get_set!("SeaStopCodes", codes, "code", String);
65 get_column!("SeaStop", company, SeaCompany);
66 get_column!("SeaStop", name, Option<String>);
67
68 get_derived_vec!(docks, SeaDock, "SELECT i FROM SeaDock WHERE stop = ?");
69 get_derived_vec!(
70 connections_from_here,
71 SeaConnection,
72 concat!(
73 "SELECT DISTINCT SeaConnection.i ",
74 "FROM (SELECT i FROM SeaDock WHERE stop = ?) A ",
75 "INNER JOIN SeaConnection ON A.i = SeaConnection.\"from\""
76 )
77 );
78 get_derived_vec!(
79 connections_to_here,
80 SeaConnection,
81 concat!(
82 "SELECT DISTINCT SeaConnection.i ",
83 "FROM (SELECT i FROM SeaDock WHERE stop = ?) A ",
84 "INNER JOIN SeaConnection ON A.i = SeaConnection.\"to\""
85 )
86 );
87 get_derived_vec!(
88 lines,
89 SeaLine,
90 concat!(
91 "SELECT DISTINCT SeaConnection.line ",
92 "FROM (SELECT i FROM SeaDock WHERE stop = ?) A ",
93 "LEFT JOIN SeaConnection ON A.i = SeaConnection.\"from\" OR A.i = SeaConnection.\"to\""
94 )
95 );
96}
97
98node_type!(SeaDock);
99impl SeaDock {
100 get_column!("SeaDock", code, Option<String>);
101 get_column!("SeaDock", stop, SeaStop);
102
103 get_derived_vec!(
104 connections_from_here,
105 SeaConnection,
106 "SELECT SeaConnection.i FROM SeaConnection WHERE SeaConnection.\"from\" = ?"
107 );
108 get_derived_vec!(
109 connections_to_here,
110 SeaConnection,
111 "SELECT SeaConnection.i FROM SeaConnection WHERE SeaConnection.\"to\" = ?"
112 );
113 get_derived_vec!(
114 lines,
115 SeaLine,
116 concat!(
117 "SELECT DISTINCT SeaConnection.line FROM SeaConnection ",
118 "WHERE SeaConnection.\"from\" = ? OR SeaConnection.\"to\" = ?"
119 )
120 );
121}
122
123node_type!(SeaConnection);
124impl SeaConnection {
125 get_column!("SeaConnection", line, SeaLine);
126 get_column!("SeaConnection", from, SeaDock);
127 get_column!("SeaConnection", to, SeaDock);
128 get_column!("SeaConnection", direction, Option<String>);
129 get_column!("SeaConnection", duration, Option<u32>);
130}