diff options
Diffstat (limited to 'src/archiver')
| -rw-r--r-- | src/archiver/gemini.rs | 26 | ||||
| -rw-r--r-- | src/archiver/gopher.rs | 26 | ||||
| -rw-r--r-- | src/archiver/mod.rs | 87 | ||||
| -rw-r--r-- | src/archiver/raw.rs | 11 |
4 files changed, 78 insertions, 72 deletions
diff --git a/src/archiver/gemini.rs b/src/archiver/gemini.rs index 3b04bcf..b74d27b 100644 --- a/src/archiver/gemini.rs +++ b/src/archiver/gemini.rs @@ -1,20 +1,22 @@ +use crate::template::{find, parse, TemplateContext}; use std::fs::write; use std::io::{Error, ErrorKind::Other, Result}; -use std::path::PathBuf; -use crate::template::{find, parse, TemplateContext}; +use std::path::Path; const FILENAME: &str = "index.gmi"; -pub fn archive(_: &PathBuf, template_directory: &PathBuf, target: &PathBuf, context: &TemplateContext) -> Result<()> { - match find(template_directory, FILENAME) { - Some(template) => { - let parsed_template = parse(&template) - .ok_or_else(|| Error::new(Other, "Unable to parse Gemini Archive template"))?; - let rendered_template = parsed_template.render(context)?; - let location = target.join(FILENAME); - write(location, rendered_template)?; - }, - None => {} +pub fn archive( + _: &Path, + template_directory: &Path, + target: &Path, + context: &TemplateContext, +) -> Result<()> { + if let Some(template) = find(template_directory, FILENAME) { + let parsed_template = parse(&template) + .ok_or_else(|| Error::new(Other, "Unable to parse Gemini Archive template"))?; + let rendered_template = parsed_template.render(context)?; + let location = target.join(FILENAME); + write(location, rendered_template)?; } Ok(()) } diff --git a/src/archiver/gopher.rs b/src/archiver/gopher.rs index 28f4f46..fc0c04f 100644 --- a/src/archiver/gopher.rs +++ b/src/archiver/gopher.rs @@ -1,20 +1,22 @@ +use crate::template::{find, parse, TemplateContext}; use std::fs::write; use std::io::{Error, ErrorKind::Other, Result}; -use std::path::PathBuf; -use crate::template::{find, parse, TemplateContext}; +use std::path::Path; const FILENAME: &str = "index.gph"; -pub fn archive(_: &PathBuf, template_directory: &PathBuf, target: &PathBuf, context: &TemplateContext) -> Result<()> { - match find(template_directory, FILENAME) { - Some(template) => { - let parsed_template = parse(&template) - .ok_or_else(|| Error::new(Other, "Unable to parse Gopher Archive template"))?; - let rendered_template = parsed_template.render(context)?; - let location = target.join(FILENAME); - write(location, rendered_template)?; - }, - None => {} +pub fn archive( + _: &Path, + template_directory: &Path, + target: &Path, + context: &TemplateContext, +) -> Result<()> { + if let Some(template) = find(template_directory, FILENAME) { + let parsed_template = parse(&template) + .ok_or_else(|| Error::new(Other, "Unable to parse Gopher Archive template"))?; + let rendered_template = parsed_template.render(context)?; + let location = target.join(FILENAME); + write(location, rendered_template)?; } Ok(()) } diff --git a/src/archiver/mod.rs b/src/archiver/mod.rs index 6f0c284..4631bcb 100644 --- a/src/archiver/mod.rs +++ b/src/archiver/mod.rs @@ -1,39 +1,39 @@ -mod raw; mod gemini; mod gopher; +mod raw; +use crate::template::{TemplateContext, TemplateValue}; use std::collections::HashMap; use std::fs::read_dir; use std::io::Result; -use std::path::PathBuf; -use time::{OffsetDateTime, format_description::FormatItem, macros::format_description}; -use crate::template::{TemplateContext, TemplateValue}; +use std::path::{Path, PathBuf}; +use time::{format_description::FormatItem, macros::format_description, OffsetDateTime}; const DATE_FORMAT: &[FormatItem<'_>] = format_description!("[year]-[month]-[day]"); struct ArchiveEntry { id: String, - slug: String + slug: String, } +type Archiver = fn(&Path, &Path, &Path, &TemplateContext) -> Result<()>; + impl ArchiveEntry { - pub fn to_template_context(archive_entries: &Vec<ArchiveEntry>) -> TemplateContext { + pub fn to_template_context(archive_entries: &[ArchiveEntry]) -> TemplateContext { let mut context = HashMap::new(); let archive_entries_collection = archive_entries .iter() - .map(|archive_entry| archive_entry.to_template_value()) + .map(ArchiveEntry::to_template_value) .collect(); context.insert( "archive_length".to_string(), - TemplateValue::Unsigned( - archive_entries.len().try_into().unwrap() - ) + TemplateValue::Unsigned(archive_entries.len().try_into().unwrap()), ); context.insert( "posts".to_string(), - TemplateValue::Collection(archive_entries_collection) + TemplateValue::Collection(archive_entries_collection), ); context @@ -42,21 +42,12 @@ impl ArchiveEntry { pub fn to_template_value(&self) -> TemplateContext { let mut context = HashMap::new(); - context.insert( - "id".to_string(), - TemplateValue::String(self.id.clone()) - ); + context.insert("id".to_string(), TemplateValue::String(self.id.clone())); - context.insert( - "slug".to_string(), - TemplateValue::String(self.slug.clone()) - ); + context.insert("slug".to_string(), TemplateValue::String(self.slug.clone())); if let Some(title) = self.title() { - context.insert( - "title".to_string(), - TemplateValue::String(title) - ); + context.insert("title".to_string(), TemplateValue::String(title)); } context @@ -64,17 +55,18 @@ impl ArchiveEntry { fn title(&self) -> Option<String> { let date = OffsetDateTime::from_unix_timestamp_nanos( - (self.id.parse::<u64>().ok()? * 1_000_000).into() - ).ok()?; + (self.id.parse::<u64>().ok()? * 1_000_000).into(), + ) + .ok()?; let short_date = date.format(&DATE_FORMAT).ok()?; - let title = self.slug.replace("-", " "); - Some(format!("{} {}", short_date, title)) + let title = self.slug.replace('-', " "); + Some(format!("{short_date} {title}")) } } fn read_archive(archive_directory: &PathBuf) -> Vec<ArchiveEntry> { let mut archive_entries = Vec::new(); - if let Ok(entries) = read_dir(&archive_directory) { + if let Ok(entries) = read_dir(archive_directory) { for entry in entries.filter_map(Result::ok) { let entry_path = entry.path(); let post_id = entry.file_name(); @@ -87,16 +79,18 @@ fn read_archive(archive_directory: &PathBuf) -> Vec<ArchiveEntry> { Some(extension) => { if extension == "gmi" { if let Some(slug) = candidate_path.file_stem() { - if let (Some(post_id), Some(slug)) = (post_id.to_str(), slug.to_str()) { + if let (Some(post_id), Some(slug)) = + (post_id.to_str(), slug.to_str()) + { archive_entries.push(ArchiveEntry { id: post_id.to_string(), - slug: slug.to_string() - }) + slug: slug.to_string(), + }); } } } - }, - _ => continue + } + _ => continue, } } } @@ -105,26 +99,29 @@ fn read_archive(archive_directory: &PathBuf) -> Vec<ArchiveEntry> { } } - archive_entries - .sort_by(|a, b| b.id.cmp(&a.id)); + archive_entries.sort_by(|a, b| b.id.cmp(&a.id)); archive_entries } - -pub fn archive(archive_directory: &PathBuf, template_directory: &PathBuf, output_directory: &PathBuf) -> Result<()> { +pub fn archive( + archive_directory: &PathBuf, + template_directory: &Path, + output_directory: &Path, +) -> Result<()> { let archivers = available_archivers(); let archive_entries = read_archive(archive_directory); let context = ArchiveEntry::to_template_context(&archive_entries); for archiver in archivers { - archiver(archive_directory, template_directory, output_directory, &context)?; + archiver( + archive_directory, + template_directory, + output_directory, + &context, + )?; } - return Ok(()) + Ok(()) } -fn available_archivers() -> Vec<fn(&PathBuf, &PathBuf, &PathBuf, &TemplateContext) -> Result<()>> { - vec![ - raw::archive, - gemini::archive, - gopher::archive - ] +fn available_archivers() -> Vec<Archiver> { + vec![raw::archive, gemini::archive, gopher::archive] } diff --git a/src/archiver/raw.rs b/src/archiver/raw.rs index 5099f2b..c3dc1cf 100644 --- a/src/archiver/raw.rs +++ b/src/archiver/raw.rs @@ -1,9 +1,14 @@ -use std::io::Result; -use std::path::PathBuf; use crate::template::TemplateContext; use crate::utils::recursively_copy; +use std::io::Result; +use std::path::Path; -pub fn archive(archive_directory: &PathBuf, _: &PathBuf, target: &PathBuf, _: &TemplateContext) -> Result<()> { +pub fn archive( + archive_directory: &Path, + _: &Path, + target: &Path, + _: &TemplateContext, +) -> Result<()> { if archive_directory.exists() { return recursively_copy(archive_directory, target); } |