val 0.4.0

An arbitrary precision calculator language
Documentation
use super::*;

#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub enum RoundingMode {
  Down,
  FromZero,
  ToEven,
  ToZero,
  Up,
}

impl Display for RoundingMode {
  fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
    write!(
      f,
      "{}",
      match self {
        RoundingMode::Down => "down",
        RoundingMode::FromZero => "from-zero",
        RoundingMode::ToEven => "to-even",
        RoundingMode::ToZero => "to-zero",
        RoundingMode::Up => "up",
      }
    )
  }
}

impl From<RoundingMode> for Round {
  fn from(mode: RoundingMode) -> Self {
    match mode {
      RoundingMode::Down => Round::Down,
      RoundingMode::FromZero => Round::AwayZero,
      RoundingMode::ToEven => Round::Nearest,
      RoundingMode::ToZero => Round::Zero,
      RoundingMode::Up => Round::Up,
    }
  }
}

impl FromStr for RoundingMode {
  type Err = String;

  fn from_str(s: &str) -> Result<Self, Self::Err> {
    match s.to_lowercase().as_str() {
      "down" => Ok(RoundingMode::Down),
      "fromzero" | "from_zero" | "from-zero" | "away_from_zero"
      | "away-from-zero" => Ok(RoundingMode::FromZero),
      "toeven" | "to_even" | "to-even" | "nearest_even" | "bankers" => {
        Ok(RoundingMode::ToEven)
      }
      "tozero" | "to_zero" | "to-zero" | "toward_zero" | "toward-zero" => {
        Ok(RoundingMode::ToZero)
      }
      "up" => Ok(RoundingMode::Up),
      _ => Err(format!("Unknown rounding mode: {s}")),
    }
  }
}