diff --git a/src/blog_post/convert.rs b/src/blog_post/convert.rs index 128dd04..a2de168 100644 --- a/src/blog_post/convert.rs +++ b/src/blog_post/convert.rs @@ -2,7 +2,5 @@ use super::render_context::RenderBlogPost; use super::BlogPost; pub(crate) fn convert_blog_post_to_render_context(post: &BlogPost) -> RenderBlogPost { - RenderBlogPost { - id: post.id.clone(), - } + RenderBlogPost::new(post.id.clone()) } diff --git a/src/blog_post/definition.rs b/src/blog_post/definition.rs index 087beef..7589986 100644 --- a/src/blog_post/definition.rs +++ b/src/blog_post/definition.rs @@ -6,9 +6,12 @@ use walkdir::WalkDir; use crate::error::CustomError; +use super::BlogPostPage; + #[derive(Debug)] pub(crate) struct BlogPost { pub(crate) id: String, + pages: Vec, } impl BlogPost { @@ -39,8 +42,21 @@ impl BlogPost { ret }; + let pages = { + let mut ret = Vec::new(); + for (real_path, _contents, parsed_document) in parsed_org_files { + let relative_to_post_dir_path = real_path.strip_prefix(post_dir)?; + ret.push(BlogPostPage::new( + relative_to_post_dir_path, + parsed_document, + )?); + } + ret + }; + Ok(BlogPost { id: post_id.to_string_lossy().into_owned(), + pages, }) } inner(root_dir.as_ref(), post_dir.as_ref()).await diff --git a/src/blog_post/mod.rs b/src/blog_post/mod.rs index 0962dda..9ec4e23 100644 --- a/src/blog_post/mod.rs +++ b/src/blog_post/mod.rs @@ -1,5 +1,7 @@ mod convert; mod definition; +mod page; mod render_context; pub(crate) use convert::convert_blog_post_to_render_context; pub(crate) use definition::BlogPost; +pub(crate) use page::BlogPostPage; diff --git a/src/blog_post/page.rs b/src/blog_post/page.rs new file mode 100644 index 0000000..21e7c3f --- /dev/null +++ b/src/blog_post/page.rs @@ -0,0 +1,24 @@ +use std::path::PathBuf; + +use crate::error::CustomError; + +#[derive(Debug)] +pub(crate) struct BlogPostPage { + /// Relative path from the root of the blog post. + path: PathBuf, + + title: String, +} + +impl BlogPostPage { + pub(crate) fn new>( + path: P, + document: organic::types::Document<'_>, + ) -> Result { + let path = path.into(); + Ok(BlogPostPage { + path, + title: "".to_owned(), + }) + } +} diff --git a/src/blog_post/render_context.rs b/src/blog_post/render_context.rs index 27fe4e4..9163d90 100644 --- a/src/blog_post/render_context.rs +++ b/src/blog_post/render_context.rs @@ -4,5 +4,11 @@ use serde::Serialize; #[serde(tag = "type")] #[serde(rename = "blog_post")] pub(crate) struct RenderBlogPost { - pub(crate) id: String, + id: String, +} + +impl RenderBlogPost { + pub(crate) fn new(id: String) -> RenderBlogPost { + RenderBlogPost { id } + } } diff --git a/src/error/error.rs b/src/error/error.rs index 1311682..9707bdb 100644 --- a/src/error/error.rs +++ b/src/error/error.rs @@ -14,6 +14,7 @@ pub(crate) enum CustomError { FromUtf8(FromUtf8Error), DusterCompile(duster::renderer::CompileError), DusterRender(duster::renderer::RenderError), + PathStripPrefix(std::path::StripPrefixError), } impl From for CustomError { @@ -81,3 +82,9 @@ impl From for CustomError { CustomError::DusterRender(value) } } + +impl From for CustomError { + fn from(value: std::path::StripPrefixError) -> Self { + CustomError::PathStripPrefix(value) + } +}