X-Git-Url: https://git.r.bdr.sh/rbdr/blog/blobdiff_plain/2f579cf4c0d8ff95af78103783c7ca8f951cc797..27c166ebb8ac1bdeebc39a642af15f491edff516:/src/command/generate.rs?ds=sidebyside diff --git a/src/command/generate.rs b/src/command/generate.rs index 59babd5..cc9e401 100644 --- a/src/command/generate.rs +++ b/src/command/generate.rs @@ -1,4 +1,13 @@ -use std::io::Result; +use std::fs::{create_dir_all, read_dir, remove_dir_all, File}; +use std::io::{Read, Result}; +use std::path::PathBuf; +use crate::configuration::Configuration; +use crate::constants::METADATA_FILENAME; +use crate::gemini_parser::parse; +use crate::generator::generate; +use crate::archiver::archive; +use crate::metadata::Metadata; +use crate::post::Post; pub struct Generate; @@ -6,6 +15,53 @@ impl Generate { pub fn new() -> Self { Generate } + + fn read_posts(&self, posts_directory: &PathBuf, max_posts: u8) -> Vec { + let mut posts = Vec::new(); + + for i in 0..max_posts { + let post_directory = posts_directory.join(i.to_string()); + match self.read_post(&post_directory, i) { + Some(post) => posts.push(post), + None => continue + } + } + + posts + } + + fn find_blog_content(&self, post_directory: &PathBuf) -> Option { + let entries = read_dir(&post_directory).ok()?; + for entry in entries.filter_map(Result::ok) { + let entry_path = entry.path(); + match entry_path.extension() { + Some(extension) => { + if extension == "gmi" { + let mut file = File::open(entry_path).ok()?; + let mut contents = String::new(); + file.read_to_string(&mut contents).ok()?; + return Some(contents); + } + }, + None => continue + } + } + None + } + + fn read_post(&self, post_directory: &PathBuf, index: u8) -> Option { + let metadata_path = post_directory.join(METADATA_FILENAME); + let metadata = Metadata::read_or_create(&metadata_path); + let raw = self.find_blog_content(&post_directory)?; + let html = parse(&raw); + + Some(Post { + metadata, + index, + html, + raw + }) + } } impl super::Command for Generate { @@ -13,8 +69,25 @@ impl super::Command for Generate { vec![] } - fn execute(&self, input: Option<&String>) -> Result<()> { - println!("GENERATE! {:?}", input); + fn execute(&self, _: Option<&String>, configuration: &Configuration, _: &String) -> Result<()> { + let _ = remove_dir_all(&configuration.blog_output_directory); + create_dir_all(&configuration.blog_output_directory)?; + + let posts = self.read_posts(&configuration.posts_directory, configuration.max_posts); + generate( + &configuration.static_directory, + &configuration.templates_directory, + &configuration.blog_output_directory, + &posts + )?; + + let _ = remove_dir_all(&configuration.archive_output_directory); + create_dir_all(&configuration.archive_output_directory)?; + archive( + &configuration.archive_directory, + &configuration.templates_directory, + &configuration.archive_output_directory + )?; return Ok(()) }