pub mod png;
pub mod svg;
use crate::box_err::BoxError;
use std::path::{Path, PathBuf};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ToImageTypeError {
#[error("Failed to extract file extension from path: '{path}'")]
ExtensionExtraction { msg: &'static str, path: PathBuf },
#[error(
"The only supported image file types are AVG and PNG; supplied extension: '{ext}' (in path: '{path}')"
)]
Unsupported { ext: String, path: PathBuf },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ImageType {
Svg,
Png,
}
impl TryFrom<&Path> for ImageType {
type Error = ToImageTypeError;
fn try_from(value: &Path) -> Result<Self, Self::Error> {
let ext = value
.extension()
.ok_or_else(|| ToImageTypeError::ExtensionExtraction {
msg: "No file extension present",
path: value.to_path_buf(),
})?
.to_str()
.ok_or_else(|| ToImageTypeError::ExtensionExtraction {
msg: "File extension is not UTF-8 compatible",
path: value.to_path_buf(),
})?;
let ext_lower = ext.to_lowercase();
match ext_lower.as_ref() {
"svg" => Ok(Self::Svg),
"png" => Ok(Self::Png),
_ => Err(ToImageTypeError::Unsupported {
ext: ext.to_string(),
path: value.to_path_buf(),
}),
}
}
}
#[derive(Error, Debug)]
pub enum Error {
#[error("'verify' is already set to a different value.")]
VerifyAlreadySet { present: String, proposed: String },
#[error(transparent)]
PngEncoding(#[from] ::png::EncodingError),
#[error(transparent)]
IO(#[from] std::io::Error),
#[error(transparent)]
Boxed(#[from] BoxError),
}
pub(crate) trait Patcher {
fn rewrite<P: AsRef<Path>, S: AsRef<str>>(
input_file: P,
output_file: P,
verify: S,
fail_if_verify_present: bool,
) -> Result<(), Error>;
}
#[cfg(test)]
mod tests {
use super::*;
use crate::util::test::is_good_error;
#[test]
fn normal_types() {
is_good_error::<Error>();
}
}