elevator_core/components/
rider.rs1use serde::{Deserialize, Serialize};
4
5use crate::entity::EntityId;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[non_exhaustive]
10pub enum RiderPhase {
11 Waiting,
13 Boarding(EntityId),
15 Riding(EntityId),
17 #[serde(alias = "Alighting")]
19 Exiting(EntityId),
20 Walking,
22 Arrived,
24 Abandoned,
26 Resident,
28}
29
30impl RiderPhase {
31 #[must_use]
39 pub const fn is_aboard(&self) -> bool {
40 matches!(self, Self::Boarding(_) | Self::Riding(_) | Self::Exiting(_))
41 }
42}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
47#[non_exhaustive]
48pub enum RiderPhaseKind {
49 Waiting,
51 Boarding,
53 Riding,
55 Exiting,
57 Walking,
59 Arrived,
61 Abandoned,
63 Resident,
65}
66
67impl RiderPhase {
68 #[must_use]
70 pub const fn kind(&self) -> RiderPhaseKind {
71 match self {
72 Self::Waiting => RiderPhaseKind::Waiting,
73 Self::Boarding(_) => RiderPhaseKind::Boarding,
74 Self::Riding(_) => RiderPhaseKind::Riding,
75 Self::Exiting(_) => RiderPhaseKind::Exiting,
76 Self::Walking => RiderPhaseKind::Walking,
77 Self::Arrived => RiderPhaseKind::Arrived,
78 Self::Abandoned => RiderPhaseKind::Abandoned,
79 Self::Resident => RiderPhaseKind::Resident,
80 }
81 }
82}
83
84impl std::fmt::Display for RiderPhaseKind {
85 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
86 match self {
87 Self::Waiting => write!(f, "Waiting"),
88 Self::Boarding => write!(f, "Boarding"),
89 Self::Riding => write!(f, "Riding"),
90 Self::Exiting => write!(f, "Exiting"),
91 Self::Walking => write!(f, "Walking"),
92 Self::Arrived => write!(f, "Arrived"),
93 Self::Abandoned => write!(f, "Abandoned"),
94 Self::Resident => write!(f, "Resident"),
95 }
96 }
97}
98
99impl std::fmt::Display for RiderPhase {
100 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
101 match self {
102 Self::Waiting => write!(f, "Waiting"),
103 Self::Boarding(id) => write!(f, "Boarding({id:?})"),
104 Self::Riding(id) => write!(f, "Riding({id:?})"),
105 Self::Exiting(id) => write!(f, "Exiting({id:?})"),
106 Self::Walking => write!(f, "Walking"),
107 Self::Arrived => write!(f, "Arrived"),
108 Self::Abandoned => write!(f, "Abandoned"),
109 Self::Resident => write!(f, "Resident"),
110 }
111 }
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct Rider {
122 pub(crate) weight: f64,
124 pub(crate) phase: RiderPhase,
126 pub(crate) current_stop: Option<EntityId>,
128 pub(crate) spawn_tick: u64,
130 pub(crate) board_tick: Option<u64>,
132}
133
134impl Rider {
135 #[must_use]
137 pub const fn weight(&self) -> f64 {
138 self.weight
139 }
140
141 #[must_use]
143 pub const fn phase(&self) -> RiderPhase {
144 self.phase
145 }
146
147 #[must_use]
149 pub const fn current_stop(&self) -> Option<EntityId> {
150 self.current_stop
151 }
152
153 #[must_use]
155 pub const fn spawn_tick(&self) -> u64 {
156 self.spawn_tick
157 }
158
159 #[must_use]
161 pub const fn board_tick(&self) -> Option<u64> {
162 self.board_tick
163 }
164}