aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Letan <contact@thomasletan.fr>2019-08-15 15:47:21 +0200
committerThomas Letan <contact@thomasletan.fr>2019-08-15 15:51:46 +0200
commitc60b223adbc8e46f125ad338ba44989048b4b4c1 (patch)
tree6e0ed7dceabfdd530ca628fea0484323a8c596af
parentchore: 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.rs5
-rw-r--r--lib/src/project.rs18
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 {