migration: askama to ramhorns
Some checks are pending
ci/woodpecker/push/publish Pipeline is pending
ci/woodpecker/pr/publish Pipeline is pending

This commit is contained in:
Mylloon 2023-04-09 19:02:06 +02:00
parent d1f1d5d478
commit 6d3b4c8398
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
11 changed files with 204 additions and 145 deletions

177
Cargo.lock generated
View file

@ -260,33 +260,10 @@ dependencies = [
] ]
[[package]] [[package]]
name = "askama" name = "arrayvec"
version = "0.12.0" version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47cbc3cf73fa8d9833727bbee4835ba5c421a0d65b72daf9a7b5d0e0f9cfb57e" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
dependencies = [
"askama_derive",
"askama_escape",
"humansize",
"num-traits",
"percent-encoding",
]
[[package]]
name = "askama_derive"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c22fbe0413545c098358e56966ff22cdd039e10215ae213cfbd65032b119fc94"
dependencies = [
"basic-toml",
"mime",
"mime_guess",
"nom",
"proc-macro2",
"quote",
"serde",
"syn 2.0.13",
]
[[package]] [[package]]
name = "askama_escape" name = "askama_escape"
@ -300,6 +277,19 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "bae"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a"
dependencies = [
"heck",
"proc-macro-error",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.21.0" version = "0.21.0"
@ -307,13 +297,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
[[package]] [[package]]
name = "basic-toml" name = "beef"
version = "0.1.2" version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c0de75129aa8d0cceaf750b89013f0e08804d6ec61416da787b35ad0d7cddf1" checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "bitflags" name = "bitflags"
@ -475,9 +462,9 @@ version = "0.1.0"
dependencies = [ dependencies = [
"actix-files", "actix-files",
"actix-web", "actix-web",
"askama",
"glob", "glob",
"minify-html", "minify-html",
"ramhorns",
"serde", "serde",
"toml", "toml",
] ]
@ -589,6 +576,15 @@ version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "heck"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
dependencies = [
"unicode-segmentation",
]
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.2.6" version = "0.2.6"
@ -627,15 +623,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
[[package]]
name = "humansize"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
dependencies = [
"libm",
]
[[package]] [[package]]
name = "idna" name = "idna"
version = "0.3.0" version = "0.3.0"
@ -689,12 +676,6 @@ version = "0.2.141"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5"
[[package]]
name = "libm"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb"
[[package]] [[package]]
name = "local-channel" name = "local-channel"
version = "0.1.3" version = "0.1.3"
@ -732,6 +713,29 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "logos"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1"
dependencies = [
"logos-derive",
]
[[package]]
name = "logos-derive"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c"
dependencies = [
"beef",
"fnv",
"proc-macro2",
"quote",
"regex-syntax",
"syn 1.0.109",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.5.0" version = "2.5.0"
@ -815,15 +819,6 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "num-traits"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
]
[[package]] [[package]]
name = "num_cpus" name = "num_cpus"
version = "1.15.0" version = "1.15.0"
@ -910,6 +905,30 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn 1.0.109",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.56" version = "1.0.56"
@ -919,6 +938,17 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "pulldown-cmark"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d9cc634bc78768157b5cbfe988ffcd1dcba95cd2b2f03a88316c08c6d00ed63"
dependencies = [
"bitflags",
"memchr",
"unicase",
]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.26" version = "1.0.26"
@ -928,6 +958,33 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "ramhorns"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47008ae2e2a9085a3f658203609d79f8a027829cf88a088d0c0084e18ba8f0b9"
dependencies = [
"arrayvec",
"beef",
"fnv",
"logos",
"pulldown-cmark",
"ramhorns-derive",
]
[[package]]
name = "ramhorns-derive"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ada9bbdd21adf426f932bf76b3db7d553538dffc16afd5fb8ce2ce2110a75536"
dependencies = [
"bae",
"fnv",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "rand" name = "rand"
version = "0.8.5" version = "0.8.5"
@ -1300,6 +1357,12 @@ dependencies = [
"tinyvec", "tinyvec",
] ]
[[package]]
name = "unicode-segmentation"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
[[package]] [[package]]
name = "url" name = "url"
version = "2.3.1" version = "2.3.1"

View file

@ -12,7 +12,7 @@ license = "AGPL-3.0-or-later"
[dependencies] [dependencies]
actix-web = "4" actix-web = "4"
actix-files = "0.6" actix-files = "0.6"
askama = "0.12.0" ramhorns = "0.14.0"
toml = "0.7.3" toml = "0.7.3"
serde = { version = "1.0.159", features = ["derive"] } serde = { version = "1.0.159", features = ["derive"] }
minify-html = "0.10.8" minify-html = "0.10.8"

View file

@ -1,3 +0,0 @@
[general]
# Directories to search for templates, relative to the crate root.
dirs = ["dist/templates", "templates"]

View file

@ -1,6 +1,6 @@
use serde::Deserialize; use serde::Deserialize;
use std::{ use std::{
fs::{self, read_to_string, remove_dir_all}, fs::{self, remove_dir_all},
path::PathBuf, path::PathBuf,
}; };
@ -21,16 +21,7 @@ pub struct FileConfig {
pub struct Config { pub struct Config {
pub fc: FileConfig, pub fc: FileConfig,
pub static_location: String, pub static_location: String,
} pub templates_location: String,
#[derive(Deserialize)]
struct AskamaConfig {
general: AskamaConfigGeneral,
}
#[derive(Deserialize)]
struct AskamaConfigGeneral {
dirs: Vec<String>,
} }
impl FileConfig { impl FileConfig {
@ -81,22 +72,21 @@ fn get_file_config(file_path: &str) -> FileConfig {
} }
} }
fn get_askama_config() -> AskamaConfig {
toml::from_str(&read_to_string("askama.toml").unwrap()).unwrap()
}
pub fn get_config(file_path: &str) -> Config { pub fn get_config(file_path: &str) -> Config {
let internal_config = get_file_config(file_path); let internal_config = get_file_config(file_path);
let static_dir = "static".to_string(); let static_dir = "static".to_string();
// TODO: Check if templates dir is coherent with the whole list let templates_dir = "templates".to_string();
let templates_dir = get_askama_config().general.dirs.last().unwrap().to_string(); let files_root = init(
// TODO: Check dist by askama config file "dist".to_string(),
let files_root = init("dist".to_string(), static_dir.clone(), templates_dir); static_dir.clone(),
templates_dir.clone(),
);
Config { Config {
fc: internal_config, fc: internal_config,
static_location: format!("{}/{}", files_root, static_dir), static_location: format!("{}/{}", files_root, static_dir),
templates_location: format!("{}/{}", files_root, templates_dir),
} }
} }

View file

@ -1,7 +1,6 @@
use crate::{config::Config, template::render};
use actix_web::{dev::ConnectionInfo, get, routes, web, HttpRequest, HttpResponse, Responder}; use actix_web::{dev::ConnectionInfo, get, routes, web, HttpRequest, HttpResponse, Responder};
use askama::Template; use ramhorns::Content;
use crate::config::Config;
#[routes] #[routes]
#[get("/.well-known/security.txt")] #[get("/.well-known/security.txt")]
@ -13,8 +12,7 @@ pub async fn security(req: HttpRequest, config: web::Data<Config>) -> impl Respo
)) ))
} }
#[derive(Template)] #[derive(Content)]
#[template(path = "security.txt")]
struct SecurityTemplate { struct SecurityTemplate {
contact: String, contact: String,
pref_lang: String, pref_lang: String,
@ -22,17 +20,19 @@ struct SecurityTemplate {
} }
fn get_security(config: Config, info: ConnectionInfo) -> String { fn get_security(config: Config, info: ConnectionInfo) -> String {
let data = SecurityTemplate { render(
contact: config.fc.mail.unwrap_or_default(), config.templates_location,
pref_lang: config.fc.lang.unwrap_or_default(), "security.txt",
url: format!( SecurityTemplate {
"{}://{}/.well-known/security.txt", contact: config.fc.mail.unwrap_or_default(),
info.scheme(), pref_lang: config.fc.lang.unwrap_or_default(),
info.host() url: format!(
), "{}://{}/.well-known/security.txt",
}; info.scheme(),
info.host()
data.render().unwrap() ),
},
)
} }
#[get("/humans.txt")] #[get("/humans.txt")]

View file

@ -1,17 +1,19 @@
use actix_web::{get, HttpResponse, Responder}; use crate::{config::Config, template::render};
use askama::Template; use actix_web::{get, web, HttpResponse, Responder};
use ramhorns::Content;
use crate::template::render_html;
#[get("/contrib")] #[get("/contrib")]
pub async fn page() -> impl Responder { pub async fn page(config: web::Data<Config>) -> impl Responder {
HttpResponse::Ok().body(get_page()) HttpResponse::Ok().body(get_page(config.get_ref().clone()))
} }
#[derive(Template)] #[derive(Content)]
#[template(path = "contrib.html")]
struct PortfolioTemplate {} struct PortfolioTemplate {}
pub fn get_page() -> std::string::String { pub fn get_page(config: Config) -> std::string::String {
render_html(&PortfolioTemplate {}) render(
config.templates_location,
"contrib.html",
PortfolioTemplate {},
)
} }

View file

@ -1,17 +1,16 @@
use actix_web::{get, HttpResponse, Responder}; use actix_web::{get, web, HttpResponse, Responder};
use askama::Template; use ramhorns::Content;
use crate::template::render_html; use crate::{config::Config, template::render};
#[get("/")] #[get("/")]
pub async fn page() -> impl Responder { pub async fn page(config: web::Data<Config>) -> impl Responder {
HttpResponse::Ok().body(get_page()) HttpResponse::Ok().body(get_page(config.get_ref().clone()))
} }
#[derive(Template)] #[derive(Content)]
#[template(path = "index.html")]
struct IndexTemplate {} struct IndexTemplate {}
pub fn get_page() -> std::string::String { pub fn get_page(config: Config) -> std::string::String {
render_html(&IndexTemplate {}) render(config.templates_location, "index.html", IndexTemplate {})
} }

View file

@ -1,17 +1,20 @@
use actix_web::{get, HttpResponse, Responder}; use actix_web::{get, web, HttpResponse, Responder};
use askama::Template; use ramhorns::Content;
use crate::template::render_html; use crate::{config::Config, template::render};
#[get("/networks")] #[get("/networks")]
pub async fn page() -> impl Responder { pub async fn page(config: web::Data<Config>) -> impl Responder {
HttpResponse::Ok().body(get_page()) HttpResponse::Ok().body(get_page(config.get_ref().clone()))
} }
#[derive(Template)] #[derive(Content)]
#[template(path = "networks.html")]
struct NetworksTemplate {} struct NetworksTemplate {}
pub fn get_page() -> std::string::String { pub fn get_page(config: Config) -> std::string::String {
render_html(&NetworksTemplate {}) render(
config.templates_location,
"networks.html",
NetworksTemplate {},
)
} }

View file

@ -1,16 +1,15 @@
use actix_web::{HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use askama::Template; use ramhorns::Content;
use crate::template::render_html; use crate::{config::Config, template::render};
pub async fn page() -> impl Responder { pub async fn page(config: web::Data<Config>) -> impl Responder {
HttpResponse::NotFound().body(get_page()) HttpResponse::NotFound().body(get_page(config.get_ref().clone()))
} }
#[derive(Template)] #[derive(Content)]
#[template(path = "404.html")]
struct Error404Template {} struct Error404Template {}
pub fn get_page() -> std::string::String { pub fn get_page(config: Config) -> std::string::String {
render_html(&Error404Template {}) render(config.templates_location, "404.html", Error404Template {})
} }

View file

@ -1,17 +1,20 @@
use actix_web::{get, HttpResponse, Responder}; use actix_web::{get, web, HttpResponse, Responder};
use askama::Template; use ramhorns::Content;
use crate::template::render_html; use crate::{config::Config, template::render};
#[get("/portfolio")] #[get("/portfolio")]
pub async fn page() -> impl Responder { pub async fn page(config: web::Data<Config>) -> impl Responder {
HttpResponse::Ok().body(get_page()) HttpResponse::Ok().body(get_page(config.get_ref().clone()))
} }
#[derive(Template)] #[derive(Content)]
#[template(path = "portfolio.html")]
struct PortfolioTemplate {} struct PortfolioTemplate {}
pub fn get_page() -> std::string::String { pub fn get_page(config: Config) -> std::string::String {
render_html(&PortfolioTemplate {}) render(
config.templates_location,
"portfolio.html",
PortfolioTemplate {},
)
} }

View file

@ -1,5 +1,8 @@
use askama::DynTemplate; use ramhorns::{Content, Ramhorns};
pub fn render_html(template: &dyn DynTemplate) -> String { pub fn render<C: Content>(template_dir: String, template: &str, data: C) -> String {
template.dyn_render().unwrap() let mut tpls: Ramhorns = Ramhorns::lazy(template_dir).unwrap();
let tpl = tpls.from_file(template).unwrap();
tpl.render(&data)
} }