elevator_core/components/
rider.rs1use serde::{Deserialize, Serialize};
4
5use super::units::Weight;
6use crate::entity::EntityId;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
10#[non_exhaustive]
11pub enum RiderPhase {
12 Waiting,
14 Boarding(EntityId),
16 Riding(EntityId),
18 #[serde(alias = "Alighting")]
20 Exiting(EntityId),
21 Walking,
23 Arrived,
25 Abandoned,
27 Resident,
29}
30
31impl RiderPhase {
32 #[must_use]
40 pub const fn is_aboard(&self) -> bool {
41 matches!(self, Self::Boarding(_) | Self::Riding(_) | Self::Exiting(_))
42 }
43}
44
45#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
48#[non_exhaustive]
49pub enum RiderPhaseKind {
50 Waiting,
52 Boarding,
54 Riding,
56 Exiting,
58 Walking,
60 Arrived,
62 Abandoned,
64 Resident,
66}
67
68impl RiderPhase {
69 #[must_use]
71 pub const fn kind(&self) -> RiderPhaseKind {
72 match self {
73 Self::Waiting => RiderPhaseKind::Waiting,
74 Self::Boarding(_) => RiderPhaseKind::Boarding,
75 Self::Riding(_) => RiderPhaseKind::Riding,
76 Self::Exiting(_) => RiderPhaseKind::Exiting,
77 Self::Walking => RiderPhaseKind::Walking,
78 Self::Arrived => RiderPhaseKind::Arrived,
79 Self::Abandoned => RiderPhaseKind::Abandoned,
80 Self::Resident => RiderPhaseKind::Resident,
81 }
82 }
83}
84
85impl std::fmt::Display for RiderPhaseKind {
86 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87 match self {
88 Self::Waiting => write!(f, "Waiting"),
89 Self::Boarding => write!(f, "Boarding"),
90 Self::Riding => write!(f, "Riding"),
91 Self::Exiting => write!(f, "Exiting"),
92 Self::Walking => write!(f, "Walking"),
93 Self::Arrived => write!(f, "Arrived"),
94 Self::Abandoned => write!(f, "Abandoned"),
95 Self::Resident => write!(f, "Resident"),
96 }
97 }
98}
99
100impl std::fmt::Display for RiderPhase {
101 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
102 match self {
103 Self::Waiting => write!(f, "Waiting"),
104 Self::Boarding(id) => write!(f, "Boarding({id:?})"),
105 Self::Riding(id) => write!(f, "Riding({id:?})"),
106 Self::Exiting(id) => write!(f, "Exiting({id:?})"),
107 Self::Walking => write!(f, "Walking"),
108 Self::Arrived => write!(f, "Arrived"),
109 Self::Abandoned => write!(f, "Abandoned"),
110 Self::Resident => write!(f, "Resident"),
111 }
112 }
113}
114
115#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
122pub struct Rider {
123 pub(crate) weight: Weight,
125 pub(crate) phase: RiderPhase,
127 pub(crate) current_stop: Option<EntityId>,
129 pub(crate) spawn_tick: u64,
131 pub(crate) board_tick: Option<u64>,
133}
134
135impl Rider {
136 #[must_use]
138 pub const fn weight(&self) -> Weight {
139 self.weight
140 }
141
142 #[must_use]
144 pub const fn phase(&self) -> RiderPhase {
145 self.phase
146 }
147
148 #[must_use]
150 pub const fn current_stop(&self) -> Option<EntityId> {
151 self.current_stop
152 }
153
154 #[must_use]
156 pub const fn spawn_tick(&self) -> u64 {
157 self.spawn_tick
158 }
159
160 #[must_use]
162 pub const fn board_tick(&self) -> Option<u64> {
163 self.board_tick
164 }
165}