| use std::fmt::{Display, Formatter}; |
| |
| #[derive(Debug, Clone, Copy, Default, Hash, Eq, PartialEq, clap::ValueEnum)] |
| pub enum Optimization { |
| #[default] |
| #[value(name = "0")] |
| O0, |
| #[value(name = "1")] |
| O1, |
| #[value(name = "2")] |
| O2, |
| #[value(name = "3")] |
| O3, |
| #[value(name = "s")] |
| Os, |
| #[value(name = "z")] |
| Oz, |
| } |
| |
| #[derive(Debug, Clone, Copy, thiserror::Error)] |
| /// An invalid optimization level |
| #[error("invalid optimization level")] |
| pub struct InvalidOptimizationLevel; |
| |
| impl std::str::FromStr for Optimization { |
| type Err = InvalidOptimizationLevel; |
| |
| fn from_str(s: &str) -> Result<Self, Self::Err> { |
| match s { |
| "0" | "O0" => Ok(Optimization::O0), |
| "1" | "O1" => Ok(Optimization::O1), |
| "2" | "O2" => Ok(Optimization::O2), |
| "3" | "O3" => Ok(Optimization::O3), |
| "s" | "Os" => Ok(Optimization::Os), |
| "z" | "Oz" => Ok(Optimization::Oz), |
| _ => Err(InvalidOptimizationLevel), |
| } |
| } |
| } |
| |
| impl Display for Optimization { |
| fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { |
| match *self { |
| Optimization::O0 => write!(f, "O0"), |
| Optimization::O1 => write!(f, "O1"), |
| Optimization::O2 => write!(f, "O2"), |
| Optimization::O3 => write!(f, "O3"), |
| Optimization::Os => write!(f, "Os"), |
| Optimization::Oz => write!(f, "Oz"), |
| } |
| } |
| } |