#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum InputFileType {
Png,
Jpeg,
Heic,
}
impl InputFileType {
pub(crate) fn extension(self) -> &'static str {
match self {
InputFileType::Png => "png",
InputFileType::Jpeg => "jpeg",
InputFileType::Heic => "heic",
}
}
pub(crate) fn parse(value: &str) -> Result<Self, String> {
match value.to_ascii_lowercase().as_str() {
"png" => Ok(InputFileType::Png),
"jpeg" | "jpg" => Ok(InputFileType::Jpeg),
"heic" => Ok(InputFileType::Heic),
other => Err(format!(
"unknown --input-file-type '{other}' (expected png, jpeg, or heic)"
)),
}
}
}
impl std::fmt::Display for InputFileType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.extension())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_accepts_every_canonical_value_case_insensitively() {
assert_eq!(InputFileType::parse("png").unwrap(), InputFileType::Png);
assert_eq!(InputFileType::parse("PNG").unwrap(), InputFileType::Png);
assert_eq!(InputFileType::parse("jpeg").unwrap(), InputFileType::Jpeg);
assert_eq!(InputFileType::parse("JPEG").unwrap(), InputFileType::Jpeg);
assert_eq!(InputFileType::parse("heic").unwrap(), InputFileType::Heic);
assert_eq!(InputFileType::parse("HEIC").unwrap(), InputFileType::Heic);
}
#[test]
fn parse_accepts_jpg_as_an_alias_for_jpeg() {
assert_eq!(InputFileType::parse("jpg").unwrap(), InputFileType::Jpeg);
assert_eq!(InputFileType::parse("JPG").unwrap(), InputFileType::Jpeg);
}
#[test]
fn parse_rejects_anything_else() {
assert!(InputFileType::parse("gif").is_err());
assert!(InputFileType::parse("").is_err());
}
#[test]
fn extension_and_display_agree() {
for kind in [InputFileType::Png, InputFileType::Jpeg, InputFileType::Heic] {
assert_eq!(kind.extension(), kind.to_string());
}
}
}