#![deny(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TravelMode {
Pedestrian,
Vehicle,
Bicycle,
Transit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct AllowedModes(u8);
impl AllowedModes {
const PEDESTRIAN: u8 = 1 << 0;
const VEHICLE: u8 = 1 << 1;
const BICYCLE: u8 = 1 << 2;
const TRANSIT: u8 = 1 << 3;
pub fn none() -> Self {
Self(0)
}
pub fn all() -> Self {
Self(Self::PEDESTRIAN | Self::VEHICLE | Self::BICYCLE | Self::TRANSIT)
}
pub fn pedestrian_only() -> Self {
Self(Self::PEDESTRIAN)
}
pub fn vehicular() -> Self {
Self(Self::VEHICLE | Self::TRANSIT)
}
pub fn active() -> Self {
Self(Self::PEDESTRIAN | Self::BICYCLE)
}
pub fn allows(self, mode: TravelMode) -> bool {
let flag = match mode {
TravelMode::Pedestrian => Self::PEDESTRIAN,
TravelMode::Vehicle => Self::VEHICLE,
TravelMode::Bicycle => Self::BICYCLE,
TravelMode::Transit => Self::TRANSIT,
};
self.0 & flag != 0
}
pub fn with_mode(mut self, mode: TravelMode) -> Self {
let flag = match mode {
TravelMode::Pedestrian => Self::PEDESTRIAN,
TravelMode::Vehicle => Self::VEHICLE,
TravelMode::Bicycle => Self::BICYCLE,
TravelMode::Transit => Self::TRANSIT,
};
self.0 |= flag;
self
}
}
pub mod prelude {
pub use crate::{AllowedModes, TravelMode};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn allowed_modes_helpers_work() {
let active = AllowedModes::active();
assert!(active.allows(TravelMode::Pedestrian));
assert!(active.allows(TravelMode::Bicycle));
assert!(!active.allows(TravelMode::Vehicle));
assert!(!active.allows(TravelMode::Transit));
let custom = AllowedModes::none().with_mode(TravelMode::Transit);
assert!(custom.allows(TravelMode::Transit));
assert!(!custom.allows(TravelMode::Vehicle));
}
}