use crate::book::Book;
use crate::error::{Error, Result, Source};
use std::fs::File;
use std::io::Write;
use std::path::Path;
use rust_i18n::t;
pub trait BookRenderer: Sync {
fn auto_path(&self, _book_file: &str) -> Result<String> {
Err(Error::default(
Source::empty(),
t!("error.renderer.no_output"),
))
}
fn render(&self, book: &Book, to: &mut dyn Write) -> Result<()>;
fn render_to_file(&self, book: &Book, path: &Path) -> Result<()> {
let mut content = vec![];
self.render(book, &mut content)?;
let mut file = File::create(path).map_err(|err| {
Error::default(
Source::empty(),
t!(
"error.renderer.file_creation",
file = path.display(),
err = err
),
)
})?;
file.write_all(&content).map_err(|err| {
Error::default(
Source::empty(),
t!(
"error.renderer.write",
file = path.display(),
err = err
),
)
})?;
Ok(())
}
}