use clap::ValueEnum;
use std::fmt;
use std::str::FromStr;
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum PresetKind {
Homebrew,
Cargo,
Pyenv,
Fink,
}
impl PresetKind {
pub const SUPPORTED_VALUES: &'static str = "homebrew, cargo, pyenv, fink";
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Homebrew => "homebrew",
Self::Cargo => "cargo",
Self::Pyenv => "pyenv",
Self::Fink => "fink",
}
}
}
impl FromStr for PresetKind {
type Err = ParsePresetKindError;
fn from_str(value: &str) -> Result<Self, Self::Err> {
match value {
"homebrew" => Ok(Self::Homebrew),
"cargo" => Ok(Self::Cargo),
"pyenv" => Ok(Self::Pyenv),
"fink" => Ok(Self::Fink),
_ => Err(ParsePresetKindError),
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ParsePresetKindError;
impl fmt::Display for ParsePresetKindError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"expected one of: {}",
PresetKind::SUPPORTED_VALUES
)
}
}
impl std::error::Error for ParsePresetKindError {}