From 160b2ea74e44207f6c8c3df04b02bfe63fba9a24 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Sun, 12 Jul 2020 19:26:53 -0400 Subject: [PATCH] add resume rendering support --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- src/app.rs | 28 ++++++++++++++++++++++++++-- src/handlers/mod.rs | 11 ++++++++++- src/main.rs | 16 ++++++++++++++-- templates/resume.rs.html | 9 +++++++++ 6 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 templates/resume.rs.html diff --git a/Cargo.lock b/Cargo.lock index 407cada..3cdc05e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,9 +213,9 @@ dependencies = [ [[package]] name = "comrak" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17058cc536cf290563e88787d7b9e6030ce4742943017cc2ffb71f88034021c" +checksum = "b818732a109eeabbe99fee28030ff8ecbd606889fcd25509ed933e6c69b7aa69" dependencies = [ "clap", "entities", diff --git a/Cargo.toml b/Cargo.toml index 47d9dbd..59429a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,11 +9,11 @@ build = "src/build.rs" [dependencies] anyhow = "1" -comrak = "0.7" +comrak = "0.8" envy = "0.4" log = "0" -pretty_env_logger = "0" mime = "0.3.0" +pretty_env_logger = "0" rand = "0" ructe = "0.11" serde_dhall = "0.5.3" diff --git a/src/app.rs b/src/app.rs index 0910cac..277331e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,7 +1,8 @@ use crate::signalboost::Person; use anyhow::Result; use serde::Deserialize; -use std::path::PathBuf; +use std::{fs, path::PathBuf}; +use comrak::{markdown_to_html, ComrakOptions}; mod defaults { use std::path::PathBuf; @@ -13,9 +14,14 @@ mod defaults { pub fn signalboost_fname() -> PathBuf { "./signalboost.dhall".into() } + pub fn port() -> u16 { 34252 } + + pub fn resume_fname() -> PathBuf { + "./static/resume/resume.md".into() + } } #[derive(Clone, Deserialize)] @@ -26,20 +32,38 @@ pub struct Config { signalboost_fname: PathBuf, #[serde(default = "defaults::port")] port: u16, + #[serde(default = "defaults::resume_fname")] + resume_fname: PathBuf, } -#[derive(Clone)] pub struct State { pub cfg: Config, pub signalboost: Vec, + pub resume: String, } pub fn init<'a>() -> Result { let cfg: Config = envy::from_env()?; let sb = serde_dhall::from_file(cfg.signalboost_fname.clone()).parse()?; + let resume = fs::read_to_string(cfg.resume_fname.clone())?; + let resume: String = { + let mut options = ComrakOptions::default(); + + options.extension.autolink = true; + options.extension.table = true; + options.extension.description_lists = true; + options.extension.superscript = true; + options.extension.strikethrough = true; + options.extension.footnotes = true; + + options.render.unsafe_ = true; + + markdown_to_html(&resume, &options) + }; Ok(State { cfg: cfg, signalboost: sb, + resume: resume, }) } diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 06188f1..4cd87f7 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -1,4 +1,8 @@ -use crate::templates::{self, RenderRucte}; +use crate::{ + app::State, + templates::{self, RenderRucte, Html}, +}; +use std::sync::Arc; use warp::{ http::{Response, StatusCode}, path, Filter, Rejection, Reply, @@ -15,3 +19,8 @@ pub async fn contact() -> Result { pub async fn feeds() -> Result { Response::builder().html(|o| templates::feeds_html(o)) } + +pub async fn resume(state: Arc) -> Result { + let state = state.clone(); + Response::builder().html(|o| templates::resume_html(o, Html(state.resume.clone()))) +} diff --git a/src/main.rs b/src/main.rs index 44cbca1..05b9677 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,22 +1,34 @@ use anyhow::Result; +use std::sync::Arc; use warp::{path, Filter}; pub mod app; pub mod handlers; pub mod signalboost; +use app::State; + const APPLICATION_NAME: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")); +fn with_state( + state: Arc, +) -> impl Filter,), Error = std::convert::Infallible> + Clone { + warp::any().map(move || state.clone()) +} + #[tokio::main] async fn main() -> Result<()> { pretty_env_logger::init(); - let state = app::init()?; + let state = Arc::new(app::init()?); let routes = warp::get() .and(path::end().and_then(handlers::index)) .or(warp::path!("contact").and_then(handlers::contact)) - .or(warp::path!("feeds").and_then(handlers::feeds)); + .or(warp::path!("feeds").and_then(handlers::feeds)) + .or(warp::path!("resume") + .and(with_state(state.clone())) + .and_then(handlers::resume)); let files = warp::path("static") .and(warp::fs::dir("./static")) diff --git a/templates/resume.rs.html b/templates/resume.rs.html new file mode 100644 index 0000000..5067cf3 --- /dev/null +++ b/templates/resume.rs.html @@ -0,0 +1,9 @@ +@use super::{header_html, footer_html}; + +@(resume: impl ToHtml) + +@:header_html(Some("Resume"), None) + +@resume + +@:footer_html()