transit_grid/core/
edge.rs1use geo::{Coord, CoordNum, LineString};
2use serde::{Deserialize, Serialize};
3
4use super::{IdType, NodeId};
5
6pub type EdgeId = IdType;
8
9#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
33pub struct TransitEdge<T: CoordNum> {
34 pub id: EdgeId,
36
37 pub source: NodeId,
39
40 pub target: NodeId,
42
43 pub length: T,
45
46 pub path: LineString<T>,
48}
49
50impl<T: CoordNum> Default for TransitEdge<T> {
51 fn default() -> Self {
52 Self {
53 id: 0,
54 source: 0,
55 target: 0,
56 length: T::zero(),
57 path: LineString(vec![]),
58 }
59 }
60}
61
62pub trait PathCoordinates<T: CoordNum> {
68 fn source_coordinate(&self) -> Coord<T>;
70 fn target_coordinate(&self) -> Coord<T>;
72}
73
74impl<T: CoordNum> PathCoordinates<T> for TransitEdge<T> {
75 fn source_coordinate(&self) -> Coord<T> {
76 self.path.points().next().unwrap().0
77 }
78
79 fn target_coordinate(&self) -> Coord<T> {
80 self.path.points().last().unwrap().0
81 }
82}
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87 use geo::coord;
88
89 #[test]
90 fn test_edge() {
91 let edge = TransitEdge {
92 id: 1,
93 source: 1,
94 target: 2,
95 length: 1.0,
96 path: LineString(vec![coord! { x:0.0, y:0.0}, coord! { x:1.0, y:1.0}]),
97 };
98 assert_eq!(edge.id, 1);
99 assert_eq!(edge.source, 1);
100 assert_eq!(edge.target, 2);
101 assert_eq!(edge.length, 1.0);
102 assert_eq!(
103 edge.path,
104 LineString(vec![coord! { x:0.0, y:0.0}, coord! { x:1.0, y:1.0}])
105 );
106 }
107
108 #[test]
109 fn test_edge_default() {
110 let edge = TransitEdge::<f64>::default();
111 assert_eq!(edge.id, 0);
112 assert_eq!(edge.source, 0);
113 assert_eq!(edge.target, 0);
114 assert_eq!(edge.path, LineString::<f64>(vec![]));
115 }
116
117 #[test]
118 fn test_edge_coordinates() {
119 let edge = TransitEdge {
120 id: 1,
121 source: 1,
122 target: 2,
123 length: 1.0,
124 path: LineString(vec![coord! { x: 0.0, y: 0.0 }, coord! { x: 1.0, y: 1.0 }]),
125 };
126 assert_eq!(edge.source_coordinate(), coord! { x: 0.0, y: 0.0 });
127 assert_eq!(edge.target_coordinate(), coord! { x: 1.0, y: 1.0 });
128 }
129}