#[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Compression {
#[default]
#[cfg_attr(feature = "serde", serde(rename = "none"))]
None,
#[cfg_attr(feature = "serde", serde(rename = "xz:fast", alias = "xz"))]
XzFast,
#[cfg_attr(feature = "serde", serde(rename = "xz:best"))]
XzBest,
}
impl Compression {
pub fn as_str(&self) -> &'static str {
match self {
Self::None => "none",
Self::XzFast => "xz:fast",
Self::XzBest => "xz:best",
}
}
}
impl core::fmt::Display for Compression {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
impl core::str::FromStr for Compression {
type Err = InvalidCompression;
fn from_str(input: &str) -> Result<Self, Self::Err> {
match input {
"none" => Ok(Self::None),
"xz" | "xz:fast" => Ok(Self::XzFast),
"xz:best" => Ok(Self::XzBest),
_ => Err(InvalidCompression),
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct InvalidCompression;
impl core::fmt::Display for InvalidCompression {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str("expected one of: none, xz, xz:fast, xz:best")
}
}
impl core::error::Error for InvalidCompression {}