diff --git a/src/blog.rs b/src/blog.rs index 7f41d68..abdf569 100644 --- a/src/blog.rs +++ b/src/blog.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use crate::{ - resource::{ResourceBuilderConfig, ResourceMetadata, ResourceMethods}, + resource::{EmbedMetadata, ResourceBuilderConfig, ResourceMetadata, ResourceMethods}, Site, SiteConfig, }; @@ -84,19 +84,15 @@ impl ResourceMethods for ResourceMetadata eyre::Result { - // TODO: update this so we're not just doing raw html injection lmao - Ok(format!( - r#" - - - - - - "#, - site_config.title, - self.title, - self.inner.get_header_image(site_config)?, - self.inner.desc, - )) + Ok(EmbedMetadata { + title: self.title.clone(), + site_name: &site_config.title, + description: Some(self.inner.desc.clone()), + image: Some(self.inner.get_header_image(site_config)?), + url: None, + theme_color: "rgb(255, 196, 252)".to_string(), + large_image: true, + } + .build()) } } diff --git a/src/images.rs b/src/images.rs index c09005c..6c92a90 100644 --- a/src/images.rs +++ b/src/images.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use crate::{ - resource::{ResourceBuilderConfig, ResourceMetadata, ResourceMethods}, + resource::{EmbedMetadata, ResourceBuilderConfig, ResourceMetadata, ResourceMethods}, Site, SiteConfig, }; @@ -37,6 +37,12 @@ pub struct ImageMetadata { pub file: String, } +impl ImageMetadata { + fn get_image_url(&self, site_config: &SiteConfig) -> eyre::Result { + Ok(site_config.cdn_url(&self.file)?.to_string()) + } +} + /// Template data for a specific image. #[derive(Debug, Serialize)] pub struct ImageTemplateData { @@ -55,7 +61,20 @@ impl ResourceMethods for ResourceMetadata { site_config: &SiteConfig, ) -> eyre::Result { Ok(ImageTemplateData { - src: site_config.cdn_url(&self.inner.file)?.to_string(), + src: self.inner.get_image_url(site_config)?, }) } + + fn get_head_data(&self, site_config: &SiteConfig) -> eyre::Result { + Ok(EmbedMetadata { + title: self.title.clone(), + site_name: &site_config.title, + description: self.inner.desc.clone(), + image: Some(self.inner.get_image_url(site_config)?), + url: None, + theme_color: "rgb(255, 196, 252)".to_string(), + large_image: true, + } + .build()) + } } diff --git a/src/resource.rs b/src/resource.rs index 7938cf7..6b198a4 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -79,6 +79,47 @@ where } } +/// struct for adding custom meta content embeds +#[derive(Debug)] +pub struct EmbedMetadata<'s> { + pub title: String, + pub site_name: &'s str, + pub description: Option, + pub url: Option, + pub image: Option, + pub theme_color: String, + pub large_image: bool, +} + +impl<'s> EmbedMetadata<'s> { + /// builds the embed html tags + pub fn build(self) -> String { + let mut s = format!(r#""#, self.title); + s = format!( + r#"{s}"#, + self.site_name + ); + if let Some(description) = self.description { + s = format!(r#"{s}"#); + } + if let Some(url) = self.url { + s = format!(r#"{s}"#); + } + if let Some(image) = self.image { + s = format!(r#"{s}"#); + } + s = format!( + r#"{s}"#, + self.theme_color + ); + if self.large_image { + s = format!(r#"{s}"#); + } + + s + } +} + #[derive(Debug, Serialize)] struct ResourceListTemplateData<'r, M, E> { resources: Vec<&'r ResourceTemplateData<'r, M, E>>,