pub(crate) mod image_uri;
pub(crate) mod ocr;
pub(crate) mod pdf_render;
pub(crate) mod pdf_text;
pub(crate) mod token_rule;
use std::path::Path;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum MediaKind {
Image(image::ImageFormat),
Heic,
Pdf,
}
pub(crate) fn classify(path: &Path) -> Option<MediaKind> {
let kind = infer::get_from_path(path).ok()??;
match kind.mime_type() {
"application/pdf" => Some(MediaKind::Pdf),
"image/heic" | "image/heif" | "image/heic-sequence" | "image/heif-sequence" => {
Some(MediaKind::Heic)
}
mime if mime.starts_with("image/") => {
image_format_of(kind.extension()).map(MediaKind::Image)
}
_ => None,
}
}
fn image_format_of(extension: &str) -> Option<image::ImageFormat> {
Some(match extension {
"png" => image::ImageFormat::Png,
"jpg" | "jpeg" => image::ImageFormat::Jpeg,
"webp" => image::ImageFormat::WebP,
"gif" => image::ImageFormat::Gif,
"bmp" => image::ImageFormat::Bmp,
"tif" | "tiff" => image::ImageFormat::Tiff,
"ico" => image::ImageFormat::Ico,
_ => return None,
})
}
pub(crate) fn format_name(format: image::ImageFormat) -> &'static str {
match format {
image::ImageFormat::Png => "png",
image::ImageFormat::Jpeg => "jpeg",
image::ImageFormat::WebP => "webp",
image::ImageFormat::Gif => "gif",
image::ImageFormat::Bmp => "bmp",
image::ImageFormat::Tiff => "tiff",
image::ImageFormat::Ico => "ico",
_ => "unknown",
}
}