use std::fmt;
use std::str::FromStr;
use serde::Deserialize;
use serde::Serialize;
use crate::ParseError;
#[derive(Clone, Copy, Serialize, Deserialize, Debug, Eq, PartialEq)]
pub enum RowAssignAlg {
#[serde(rename = "finite_cpu")]
FiniteCpu,
#[serde(rename = "slice")]
Slice,
#[serde(rename = "sams")]
Sams,
#[serde(rename = "gibbs")]
Gibbs,
}
impl fmt::Display for RowAssignAlg {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let s = match self {
RowAssignAlg::FiniteCpu => "FiniteCpu",
RowAssignAlg::Gibbs => "Gibbs",
RowAssignAlg::Slice => "Slice",
RowAssignAlg::Sams => "Sams",
};
write!(f, "{s}")
}
}
impl FromStr for RowAssignAlg {
type Err = ParseError<String>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"finite_cpu" => Ok(RowAssignAlg::FiniteCpu),
"gibbs" => Ok(RowAssignAlg::Gibbs),
"slice" => Ok(RowAssignAlg::Slice),
"sams" => Ok(RowAssignAlg::Sams),
_ => Err(ParseError(s.to_owned())),
}
}
}
impl<'s> From<&'s str> for RowAssignAlg {
fn from(value: &'s str) -> Self {
Self::from_str(value).unwrap()
}
}
#[derive(Clone, Copy, Serialize, Deserialize, Debug, Eq, PartialEq)]
pub enum ColAssignAlg {
#[serde(rename = "finite_cpu")]
FiniteCpu,
#[serde(rename = "gibbs")]
Gibbs,
#[serde(rename = "slice")]
Slice,
}
impl fmt::Display for ColAssignAlg {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let s = match self {
ColAssignAlg::FiniteCpu => "FiniteCpu",
ColAssignAlg::Gibbs => "Gibbs",
ColAssignAlg::Slice => "Slice",
};
write!(f, "{s}")
}
}
impl FromStr for ColAssignAlg {
type Err = ParseError<String>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"finite_cpu" => Ok(ColAssignAlg::FiniteCpu),
"gibbs" => Ok(ColAssignAlg::Gibbs),
"slice" => Ok(ColAssignAlg::Slice),
_ => Err(ParseError(s.to_owned())),
}
}
}
impl<'s> From<&'s str> for ColAssignAlg {
fn from(value: &'s str) -> Self {
Self::from_str(value).unwrap()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_row_alg_from_string_finite_cpu() {
assert_eq!(
RowAssignAlg::from_str("finite_cpu").unwrap(),
RowAssignAlg::FiniteCpu
);
}
#[test]
fn test_row_alg_from_string_slice() {
assert_eq!(
RowAssignAlg::from_str("slice").unwrap(),
RowAssignAlg::Slice
);
}
#[test]
fn test_row_alg_from_string_gibbs() {
assert_eq!(
RowAssignAlg::from_str("gibbs").unwrap(),
RowAssignAlg::Gibbs
);
}
#[test]
fn test_row_alg_from_string_sams() {
assert_eq!(RowAssignAlg::from_str("sams").unwrap(), RowAssignAlg::Sams);
}
#[test]
fn test_row_alg_from_string_invalid() {
assert!(RowAssignAlg::from_str("finte").is_err());
}
#[test]
fn test_col_alg_from_string_finite_cpu() {
assert_eq!(
ColAssignAlg::from_str("finite_cpu").unwrap(),
ColAssignAlg::FiniteCpu
);
}
#[test]
fn test_col_alg_from_string_slice() {
assert_eq!(
ColAssignAlg::from_str("slice").unwrap(),
ColAssignAlg::Slice
);
}
#[test]
fn test_col_alg_from_string_gibbs() {
assert_eq!(
ColAssignAlg::from_str("gibbs").unwrap(),
ColAssignAlg::Gibbs
);
}
#[test]
fn test_col_alg_from_string_invalid() {
assert!(ColAssignAlg::from_str("finte").is_err());
}
}