diff options
author | Thomas Letan <contact@thomasletan.fr> | 2019-08-15 15:47:21 +0200 |
---|---|---|
committer | Thomas Letan <contact@thomasletan.fr> | 2019-08-15 15:51:46 +0200 |
commit | c60b223adbc8e46f125ad338ba44989048b4b4c1 (patch) | |
tree | 6e0ed7dceabfdd530ca628fea0484323a8c596af | |
parent | chore: Abstract away the loading process of a Book project (diff) |
refactor: Make [load_and_render] static and self-sufficient
The rationale behind this choice is to provide a less cumbersome entry
point for loading a Book project in memory.
-rw-r--r-- | app/src/main.rs | 5 | ||||
-rw-r--r-- | lib/src/project.rs | 18 |
2 files changed, 12 insertions, 11 deletions
diff --git a/app/src/main.rs b/app/src/main.rs index 52d590d..949f0ed 100644 --- a/app/src/main.rs +++ b/app/src/main.rs @@ -11,7 +11,7 @@ use clap::{App, SubCommand}; use ogmarkup::typography::FRENCH; -use libceltchar::{Error, Zip, EpubWriter, Loader}; +use libceltchar::{Error, Zip, Project, EpubWriter}; #[cfg(debug_assertions)] use std::env::current_dir; @@ -25,8 +25,7 @@ fn build(assets : &PathBuf) -> Result<(), Error> { let root = find_root()?; let loader = Fs; - let project = loader.load_project(&root)? - .load_and_render(&loader, &FRENCH)?; + let project = Project::load_and_render(&root, &loader, &FRENCH)?; let mut zip_writer = Zip::init()?; zip_writer.generate(&project, assets)?; diff --git a/lib/src/project.rs b/lib/src/project.rs index 367aca9..e5ba7d4 100644 --- a/lib/src/project.rs +++ b/lib/src/project.rs @@ -76,24 +76,26 @@ pub struct Project<C, I> { pub numbering: Option<bool>, } -impl<C, I> Project<C, Vec<I>> { +impl Project<Cover, String> { pub fn load_and_render<'input, T, L> ( - self, + id : &L::ProjId, loader : &L, typo : &T, ) -> Result<Project<Cover, String>, Error> where T : Typography, - L : Loader<CovId = C, DocId = I>, + L : Loader, { - let numbering = self.numbering; - let author = self.author; - let title = self.title; - let cover = self.cover + let project = loader.load_project(id)?; + + let numbering = project.numbering; + let author = project.author; + let title = project.title; + let cover = project.cover .map(|x| loader.load_cover(&x).or_raise("cannot load the cover")) .map_or(Ok(None), |r| r.map(Some))?; - self.chapters.into_iter() + project.chapters.into_iter() .map(|chapter| chapter.load_and_render(loader, typo)) .collect::<Result<Vec<Chapter<String>>, Error>>() .map(|x| Project { |