From f5fee63a1543d8e99458330aaeb33438286a0d32 Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Thu, 30 Mar 2023 23:40:34 +0200 Subject: [PATCH] ezidam: icons: moved to own module, macro to generate struct constants, ability to use as tera templates --- crates/ezidam/src/icons.rs | 59 +++++++++++++++++++++++++++ crates/ezidam/src/lib.rs | 7 +++- crates/ezidam/src/menu.rs | 1 - crates/ezidam/src/menu/icons.rs | 5 --- crates/ezidam/src/menu/items/admin.rs | 11 ++--- crates/ezidam/src/menu/items/user.rs | 5 ++- 6 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 crates/ezidam/src/icons.rs delete mode 100644 crates/ezidam/src/menu/icons.rs diff --git a/crates/ezidam/src/icons.rs b/crates/ezidam/src/icons.rs new file mode 100644 index 0000000..54dd74f --- /dev/null +++ b/crates/ezidam/src/icons.rs @@ -0,0 +1,59 @@ +use rocket_dyn_templates::tera::Tera; + +pub struct Icon { + /// Lowercase name of icon + name: &'static str, + /// Find icons on https://tabler-icons.io + pub svg: &'static str, +} + +/// Macro to generate icons +/// +/// # Arguments +/// +/// * `name` - Name of icon in lowercase +/// * `cap_name` - Capitalized name of icon +/// * `svg` - Icon in svg +macro_rules! icons { + ($($name:expr, $cap_name:ident, $svg:expr),+) => { + $( + #[allow(non_upper_case_globals)] + pub const $cap_name: Icon = Icon { + name: $name, + svg: $svg, + }; + )+ + }; +} + +impl Icon { + icons! { + "home", Home, r#""#, + "logout", Logout, r#""#, + "settings", Settings, r#""#, + "apps", Apps, r#"svg>"#, + "plus", Plus, r#""# + } +} + +/// Add icons as tera templates +/// +/// To call an icon in tera: `{% include "icons/icon_name" %}` +pub fn icons_to_templates(tera: &mut Tera) { + let icons = [ + Icon::Home, + Icon::Logout, + Icon::Settings, + Icon::Apps, + Icon::Plus, + ]; + + // For each icon, it will output: ("icons/name", "...") + let tera_icons = icons + .iter() + .map(|icon| (format!("icons/{}", icon.name), icon.svg)); + + // Add icons as tera templates + tera.add_raw_templates(tera_icons) + .expect("failed to add icons"); +} diff --git a/crates/ezidam/src/lib.rs b/crates/ezidam/src/lib.rs index ae532b9..3ad6e20 100644 --- a/crates/ezidam/src/lib.rs +++ b/crates/ezidam/src/lib.rs @@ -5,6 +5,7 @@ mod database; mod error; mod file_from_bytes; mod guards; +mod icons; mod id; mod menu; mod oauth; @@ -21,6 +22,7 @@ pub fn rocket_setup(rocket_builder: Rocket) -> Rocket { use cache::CacheControl; use database::Database; use error::catchers; + use icons::icons_to_templates; use response_timer::ResponseTimer; use rocket::fs::FileServer; use rocket_dyn_templates::Template; @@ -35,7 +37,10 @@ pub fn rocket_setup(rocket_builder: Rocket) -> Rocket { let rocket_builder = Database::rocket(rocket_builder); // Templates - let rocket_builder = rocket_builder.attach(Template::fairing()); + let rocket_builder = rocket_builder.attach(Template::custom(|engines| { + // Add icons as tera templates + icons_to_templates(&mut engines.tera) + })); // Static assets let rocket_builder = rocket_builder.mount("/", FileServer::from("static")); diff --git a/crates/ezidam/src/menu.rs b/crates/ezidam/src/menu.rs index 37f2753..72e8a7e 100644 --- a/crates/ezidam/src/menu.rs +++ b/crates/ezidam/src/menu.rs @@ -1,4 +1,3 @@ -mod icons; mod items; mod template; diff --git a/crates/ezidam/src/menu/icons.rs b/crates/ezidam/src/menu/icons.rs deleted file mode 100644 index 897ff83..0000000 --- a/crates/ezidam/src/menu/icons.rs +++ /dev/null @@ -1,5 +0,0 @@ -/// Find icons on https://tabler-icons.io -pub const HOME: &str = r#""#; -pub const LOGOUT: &str = r#""#; -pub const SETTINGS: &str = r#""#; -pub const APPS: &str = r#"svg>"#; diff --git a/crates/ezidam/src/menu/items/admin.rs b/crates/ezidam/src/menu/items/admin.rs index 47c9be8..93da7dd 100644 --- a/crates/ezidam/src/menu/items/admin.rs +++ b/crates/ezidam/src/menu/items/admin.rs @@ -1,4 +1,5 @@ -use crate::menu::{icons, MainItem, SubItem}; +use crate::icons::Icon; +use crate::menu::{MainItem, SubItem}; use crate::routes; use rocket::uri; @@ -24,28 +25,28 @@ impl AdminMenu { id: AdminMenu::Exit.id(), label: "Exit admin panel", link: uri!(routes::root::homepage).to_string(), - icon: icons::LOGOUT, + icon: Icon::Logout.svg, sub: None, }, MainItem { id: AdminMenu::Dashboard.id(), label: "Admin dashboard", link: uri!(routes::admin::dashboard::admin_dashboard).to_string(), - icon: icons::HOME, + icon: Icon::Home.svg, sub: None, }, MainItem { id: AdminMenu::Apps.id(), label: "Applications", link: uri!(routes::admin::apps::admin_apps).to_string(), - icon: icons::APPS, + icon: Icon::Apps.svg, sub: None, }, MainItem { id: AdminMenu::Settings.id(), label: "Server settings", link: uri!(routes::admin::settings::settings_branding).to_string(), - icon: icons::SETTINGS, + icon: Icon::Settings.svg, sub: Some(vec![ SubItem { label: "Branding", diff --git a/crates/ezidam/src/menu/items/user.rs b/crates/ezidam/src/menu/items/user.rs index 4854583..f7e3bb5 100644 --- a/crates/ezidam/src/menu/items/user.rs +++ b/crates/ezidam/src/menu/items/user.rs @@ -1,4 +1,5 @@ -use crate::menu::{icons, MainItem}; +use crate::icons::Icon; +use crate::menu::MainItem; use crate::routes; use rocket::uri; @@ -17,7 +18,7 @@ impl UserMenu { id: UserMenu::Home.id(), label: "Home", link: uri!(routes::root::homepage).to_string(), - icon: icons::HOME, + icon: Icon::Home.svg, sub: None, }] }