aboutsummaryrefslogtreecommitdiffstats
path: root/src/ctx.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctx.rs')
-rw-r--r--src/ctx.rs21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/ctx.rs b/src/ctx.rs
index 63b54ff..904667d 100644
--- a/src/ctx.rs
+++ b/src/ctx.rs
@@ -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)
},