use eyre::Result;
use crate::zip::Zip;
use crate::ZipCommand;
use crate::ZipLibrary;
use std::io::Read;
use std::io::Write;
use std::path::Path;
pub enum ZipCommandOrLibrary {
Command(ZipCommand),
Library(ZipLibrary),
}
impl Zip for ZipCommandOrLibrary {
fn write_file<P: AsRef<Path>, R: Read>(&mut self, path: P, content: R) -> Result<()> {
match self {
ZipCommandOrLibrary::Command(ref mut command) => command.write_file(path, content),
ZipCommandOrLibrary::Library(ref mut library) => library.write_file(path, content),
}
}
fn generate<W: Write>(&mut self, to: W) -> Result<()> {
match self {
ZipCommandOrLibrary::Command(ref mut command) => command.generate(to),
ZipCommandOrLibrary::Library(ref mut library) => library.generate(to),
}
}
}
impl ZipCommandOrLibrary {
pub fn new(command: &str) -> Result<ZipCommandOrLibrary> {
ZipCommand::new()
.map(|mut z| {
z.command(command);
z
})
.and_then(|z| z.test().map(|_| z))
.map(ZipCommandOrLibrary::Command)
.or_else(|_| ZipLibrary::new().map(ZipCommandOrLibrary::Library))
}
}