use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RecursionSemantics {
None,
#[default]
Cautious,
Brave,
}
impl RecursionSemantics {
pub fn allows_recursion(self) -> bool {
self != RecursionSemantics::None
}
}
impl Display for RecursionSemantics {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
RecursionSemantics::None => write!(f, "none"),
RecursionSemantics::Cautious => write!(f, "cautious"),
RecursionSemantics::Brave => write!(f, "brave"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_cautious() {
assert_eq!(RecursionSemantics::default(), RecursionSemantics::Cautious);
assert!(!RecursionSemantics::None.allows_recursion());
assert!(RecursionSemantics::Cautious.allows_recursion());
assert!(RecursionSemantics::Brave.allows_recursion());
}
#[test]
fn display_matches_serde_names() {
assert_eq!(RecursionSemantics::None.to_string(), "none");
assert_eq!(RecursionSemantics::Cautious.to_string(), "cautious");
assert_eq!(RecursionSemantics::Brave.to_string(), "brave");
}
}