gatelogue_types/node/
sea.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 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}