use std::fmt;
use std::str::FromStr;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum HotReloadMode {
All,
#[default]
Pax,
Logic,
Off,
}
impl HotReloadMode {
pub const fn as_str(self) -> &'static str {
match self {
Self::All => "all",
Self::Pax => "pax",
Self::Logic => "logic",
Self::Off => "off",
}
}
pub const fn reloads_pax(self) -> bool {
matches!(self, Self::All | Self::Pax)
}
pub const fn reloads_logic(self) -> bool {
matches!(self, Self::All | Self::Logic)
}
}
impl fmt::Display for HotReloadMode {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
impl FromStr for HotReloadMode {
type Err = String;
fn from_str(value: &str) -> Result<Self, Self::Err> {
match value.trim().to_ascii_lowercase().as_str() {
"all" => Ok(Self::All),
"pax" => Ok(Self::Pax),
"logic" => Ok(Self::Logic),
"off" => Ok(Self::Off),
_ => Err(format!(
"unsupported hot-reload mode `{value}`; expected one of: all, pax, logic, off"
)),
}
}
}
#[cfg(test)]
mod tests {
use super::HotReloadMode;
#[test]
fn pax_is_the_debug_default() {
assert_eq!(HotReloadMode::default(), HotReloadMode::Pax);
}
#[test]
fn modes_expose_independent_reload_lanes() {
assert_eq!(
(
HotReloadMode::All.reloads_pax(),
HotReloadMode::All.reloads_logic()
),
(true, true)
);
assert_eq!(
(
HotReloadMode::Pax.reloads_pax(),
HotReloadMode::Pax.reloads_logic()
),
(true, false)
);
assert_eq!(
(
HotReloadMode::Logic.reloads_pax(),
HotReloadMode::Logic.reloads_logic()
),
(false, true)
);
assert_eq!(
(
HotReloadMode::Off.reloads_pax(),
HotReloadMode::Off.reloads_logic()
),
(false, false)
);
}
#[test]
fn stable_spellings_round_trip() {
for mode in [
HotReloadMode::All,
HotReloadMode::Pax,
HotReloadMode::Logic,
HotReloadMode::Off,
] {
assert_eq!(mode.as_str().parse(), Ok(mode));
assert_eq!(mode.to_string(), mode.as_str());
}
}
}