feat: implement core markdown rendering pipeline

Add minimal e2e pipeline to transform content → HTML:

- src/error.rs: Custom error types with thiserror
- src/content.rs: YAML frontmatter parsing via gray_matter
- src/render.rs: Markdown → HTML via pulldown-cmark
- src/templates.rs: Maud templates for base layout and posts
- src/main.rs: Pipeline orchestrator

All 15 blog posts successfully rendered to public/blog/*/index.html.
Added thiserror and walkdir dependencies.
Added public/ and DepMap fragment to .gitignore and AGENTS.md.
This commit is contained in:
Timothy DeHerrera
2026-01-24 19:01:30 -07:00
parent 8df37127a1
commit e07a9e87e6
9 changed files with 387 additions and 1 deletions

42
src/error.rs Normal file
View File

@@ -0,0 +1,42 @@
//! Custom error types for the nrd.sh compiler.
use std::path::PathBuf;
/// All errors that can occur during site compilation.
#[derive(Debug, thiserror::Error)]
pub enum Error {
/// Failed to read a content file.
#[error("failed to read {path}: {source}")]
ReadFile {
path: PathBuf,
#[source]
source: std::io::Error,
},
/// Failed to parse frontmatter.
#[error("invalid frontmatter in {path}: {message}")]
Frontmatter { path: PathBuf, message: String },
/// Failed to write output file.
#[error("failed to write {path}: {source}")]
WriteFile {
path: PathBuf,
#[source]
source: std::io::Error,
},
/// Failed to create output directory.
#[error("failed to create directory {path}: {source}")]
CreateDir {
path: PathBuf,
#[source]
source: std::io::Error,
},
/// Content directory not found.
#[error("content directory not found: {0}")]
ContentDirNotFound(PathBuf),
}
/// Result type alias for compiler operations.
pub type Result<T> = std::result::Result<T, Error>;