From 7e4da5f0de16c35ce304620bd37b08d57ff46858 Mon Sep 17 00:00:00 2001 From: alyx Date: Fri, 12 Jan 2024 01:28:22 -0500 Subject: Custom font support complete --- src/ctx.rs | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'src/ctx.rs') diff --git a/src/ctx.rs b/src/ctx.rs index 904667d..df910bd 100644 --- a/src/ctx.rs +++ b/src/ctx.rs @@ -3,6 +3,7 @@ use super::deserialize as de; use std::sync::Arc; use std::collections::BTreeMap; use super::font::FontQuery; +use super::config::STATE; pub mod model { use std::sync::Arc; @@ -70,7 +71,7 @@ pub mod model { #[derive(serde::Serialize, Debug)] #[serde(untagged)] pub enum Font { - Url { css: Arc }, + External { css: Arc, name: Arc }, Name { name: Arc }, } @@ -89,10 +90,9 @@ pub mod model { #[derive(Debug)] pub struct ResponseCtx(pub model::Data, pub StatusCode); -impl From<(Result, (StatusCode, &'static str)>, Option, BTreeMap)> for ResponseCtx { - fn from(v: (Result, (StatusCode, &'static str)>, Option, BTreeMap)) -> ResponseCtx { - let (v, f, q) = v; - match v { +impl ResponseCtx { + pub async fn create(api_result: Result, (StatusCode, &'static str)>, font_query: Option, query: BTreeMap) -> ResponseCtx { + match api_result { Ok(a) => { let (user, track) = a.as_ref(); ResponseCtx(model::Data::Data { @@ -123,12 +123,29 @@ impl From<(Result, (StatusCode, &'static str)>, Optio 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() }), + font: match font_query { + Some(FontQuery { google_font: Some(f), .. }) if STATE.has_google_api_key() => { + let css = match STATE.get_fontinfo(&f.to_string()).await { + Ok(css) => css, + Err((status, error)) => { return ResponseCtx(model::Data::Error {error}, status); } + }; + Some(model::Font::External { + css, + name: f + }) + }, + Some(FontQuery { include_font: Some(f), .. }) => Some( + model::Font::External { + css: format!( + "@font-face {{ font-family: 'included_font'; src: url('{}'); }}", + f.replace("\\", "\\\\") + .replace("'", "\\'")).into(), + name: "included_font".into() + }), + Some(FontQuery { font: Some(s), .. }) => Some(model::Font::Name { name: s }), _ => None, }, - query: q + query }, StatusCode::OK) }, Err((status, error)) => { -- cgit v1.2.3-54-g00ecf