use ant_protocol::CLOSE_GROUP_SIZE;
use core::fmt::Debug;
use std::num::NonZeroUsize;
use crate::close_group_majority;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ResponseQuorum {
One,
Majority,
All,
N(NonZeroUsize),
}
impl std::str::FromStr for ResponseQuorum {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"one" => Ok(ResponseQuorum::One),
"majority" => Ok(ResponseQuorum::Majority),
"all" => Ok(ResponseQuorum::All),
_ => {
if let Ok(n) = s.parse::<usize>() {
let n = NonZeroUsize::new(n);
match n {
Some(n) => Ok(ResponseQuorum::N(n)),
None => Err("Quorum value must be greater than 0".to_string()),
}
} else {
Err("Invalid quorum value".to_string())
}
}
}
}
}
impl ResponseQuorum {
pub fn get_value(&self) -> usize {
match self {
ResponseQuorum::Majority => close_group_majority(),
ResponseQuorum::All => CLOSE_GROUP_SIZE,
ResponseQuorum::N(v) => v.get(),
ResponseQuorum::One => 1,
}
}
}