use std::io::{self, Read};
use std::path::{Path, PathBuf};
use crate::magick_rust::MagickWand;
#[derive(Debug)]
pub enum ImageResource {
Path(String),
Data(Vec<u8>),
MagickWand(MagickWand),
}
impl ImageResource {
pub fn from_path<P: AsRef<Path>>(path: P) -> ImageResource {
ImageResource::Path(path.as_ref().to_string_lossy().to_string())
}
pub fn from_reader<R: Read>(mut reader: R) -> Result<ImageResource, io::Error> {
let mut buffer = Vec::new();
reader.read_to_end(&mut buffer)?;
Ok(ImageResource::Data(buffer))
}
pub fn with_capacity(capacity: usize) -> ImageResource {
ImageResource::Data(Vec::with_capacity(capacity))
}
}
impl ImageResource {
pub fn into_string(self) -> Option<String> {
if let ImageResource::Path(p) = self {
Some(p)
} else {
None
}
}
pub fn into_path_buf(self) -> Option<PathBuf> {
if let ImageResource::Path(p) = self {
Some(PathBuf::from(p))
} else {
None
}
}
pub fn into_vec(self) -> Option<Vec<u8>> {
if let ImageResource::Data(d) = self {
Some(d)
} else {
None
}
}
pub fn into_magick_wand(self) -> Option<MagickWand> {
if let ImageResource::MagickWand(mw) = self {
Some(mw)
} else {
None
}
}
}
impl ImageResource {
pub fn as_str(&self) -> Option<&str> {
if let ImageResource::Path(p) = self {
Some(p.as_str())
} else {
None
}
}
pub fn as_path(&self) -> Option<&Path> {
if let ImageResource::Path(p) = self {
Some(p.as_ref())
} else {
None
}
}
pub fn as_u8_slice(&self) -> Option<&[u8]> {
if let ImageResource::Data(d) = self {
Some(d.as_slice())
} else {
None
}
}
pub fn as_magick_wand(&self) -> Option<&MagickWand> {
if let ImageResource::MagickWand(mw) = self {
Some(mw)
} else {
None
}
}
}
unsafe impl Send for ImageResource {}