diff options
author | alyx <alyx@aleteoryx.me> | 2023-11-22 19:49:27 -0500 |
---|---|---|
committer | alyx <alyx@aleteoryx.me> | 2023-11-22 19:49:27 -0500 |
commit | 41a5fa81b5c12feb8aab0ad82d42c135e93065f7 (patch) | |
tree | bfc1f1e7ba3d35acff28df0c3e369a32d163dcfa /src/ctx.rs | |
parent | be166d93b7aabb5b260e21c10b1b247704858193 (diff) | |
download | lfm_embed-41a5fa81b5c12feb8aab0ad82d42c135e93065f7.tar.gz lfm_embed-41a5fa81b5c12feb8aab0ad82d42c135e93065f7.tar.bz2 lfm_embed-41a5fa81b5c12feb8aab0ad82d42c135e93065f7.zip |
Add custom font support.
Diffstat (limited to 'src/ctx.rs')
-rw-r--r-- | src/ctx.rs | 21 |
1 files changed, 17 insertions, 4 deletions
@@ -2,6 +2,7 @@ use reqwest::StatusCode; use super::deserialize as de; use std::sync::Arc; use std::collections::BTreeMap; +use super::font::FontQuery; pub mod model { use std::sync::Arc; @@ -66,6 +67,13 @@ pub mod model { pub loved: bool } + #[derive(serde::Serialize, Debug)] + #[serde(untagged)] + pub enum Font { + Url { css: Arc<str> }, + Name { name: Arc<str> }, + } + /// The context passed in to all themes. /// /// Serialized as untagged, so themes should check if `error` is set and decide whether to show an error state or try rendering user info. @@ -75,15 +83,15 @@ pub mod model { /// Contains text explaining a potential error. Error { error: &'static str }, /// Contains data about a user and what they're listening to. - Data { user: User, scrobble: Scrobble, query: BTreeMap<String, String> } + Data { user: User, scrobble: Scrobble, font: Option<Font>, query: BTreeMap<String, String>, } } } #[derive(Debug)] pub struct ResponseCtx(pub model::Data, pub StatusCode); -impl From<(Result<Arc<(de::User, de::Track)>, (StatusCode, &'static str)>, BTreeMap<String, String>)> for ResponseCtx { - fn from(v: (Result<Arc<(de::User, de::Track)>, (StatusCode, &'static str)>, BTreeMap<String, String>)) -> ResponseCtx { - let (v, q) = v; +impl From<(Result<Arc<(de::User, de::Track)>, (StatusCode, &'static str)>, Option<FontQuery>, BTreeMap<String, String>)> for ResponseCtx { + fn from(v: (Result<Arc<(de::User, de::Track)>, (StatusCode, &'static str)>, Option<FontQuery>, BTreeMap<String, String>)) -> ResponseCtx { + let (v, f, q) = v; match v { Ok(a) => { let (user, track) = a.as_ref(); @@ -115,6 +123,11 @@ impl From<(Result<Arc<(de::User, de::Track)>, (StatusCode, &'static str)>, BTree url: track.url.clone(), loved: track.loved.unwrap_or(false) }, + font: match f { + Some(FontQuery { font: Some(s), include_font: None }) => Some(model::Font::Name { name: s }), + Some(FontQuery { include_font: Some(s), .. }) => Some(model::Font::Url { css: format!("@font-face {{ font-family: 'included_font'; src: url('{}'); }}", s.replace("\\", "\\\\").replace("'", "\\'")).into() }), + _ => None, + }, query: q }, StatusCode::OK) }, |