aboutsummaryrefslogtreecommitdiffstats
path: root/src/ctx.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctx.rs')
-rw-r--r--src/ctx.rs35
1 files changed, 26 insertions, 9 deletions
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<str> },
+ External { css: Arc<str>, name: Arc<str> },
Name { name: Arc<str> },
}
@@ -89,10 +90,9 @@ pub mod model {
#[derive(Debug)]
pub struct ResponseCtx(pub model::Data, pub StatusCode);
-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 {
+impl ResponseCtx {
+ pub async fn create(api_result: Result<Arc<(de::User, de::Track)>, (StatusCode, &'static str)>, font_query: Option<FontQuery>, query: BTreeMap<String, String>) -> ResponseCtx {
+ match api_result {
Ok(a) => {
let (user, track) = a.as_ref();
ResponseCtx(model::Data::Data {
@@ -123,12 +123,29 @@ impl From<(Result<Arc<(de::User, de::Track)>, (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)) => {