Skip to main content

systemprompt_content/
list_branding_provider.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use serde_json::Value;
5use systemprompt_models::ContentConfigRaw;
6use systemprompt_provider_contracts::{
7    PageContext, PageDataProvider, ProviderError, ProviderResult,
8};
9
10#[derive(Debug, Clone, Copy, Default)]
11pub struct DefaultListBrandingProvider;
12
13fn resolve_content_raw<'a>(ctx: &'a PageContext<'_>) -> ProviderResult<&'a ContentConfigRaw> {
14    ctx.content_config::<ContentConfigRaw>().ok_or_else(|| {
15        ProviderError::Configuration("ContentConfig not available in PageContext".into())
16    })
17}
18
19#[async_trait]
20impl PageDataProvider for DefaultListBrandingProvider {
21    fn provider_id(&self) -> &'static str {
22        "default-list-branding"
23    }
24
25    async fn provide_page_data(&self, ctx: &PageContext<'_>) -> ProviderResult<Value> {
26        let Some(source_name) = ctx.page_type.strip_suffix("-list") else {
27            return Ok(serde_json::json!({}));
28        };
29
30        let content_config = resolve_content_raw(ctx)?;
31
32        let source = content_config.content_sources.get(source_name);
33        let org = &content_config.metadata.structured_data.organization;
34        let language = ctx.web_config.i18n.default_locale.as_str();
35        let branding = &ctx.web_config.branding;
36
37        let source_branding = source.and_then(|s| s.branding.as_ref());
38
39        let blog_name = source_branding
40            .and_then(|b| b.name.as_deref())
41            .unwrap_or(&branding.name);
42
43        let blog_description = source_branding
44            .and_then(|b| b.description.as_deref())
45            .unwrap_or(&branding.description);
46
47        let blog_image = source_branding
48            .and_then(|b| b.image.as_deref())
49            .map_or_else(String::new, |img| format!("{}{}", org.url, img));
50
51        let blog_keywords = source_branding
52            .and_then(|b| b.keywords.as_deref())
53            .unwrap_or("");
54
55        Ok(serde_json::json!({
56            "BLOG_NAME": blog_name,
57            "BLOG_DESCRIPTION": blog_description,
58            "BLOG_IMAGE": blog_image,
59            "BLOG_KEYWORDS": blog_keywords,
60            "BLOG_URL": format!("{}/{}", org.url, source_name),
61            "BLOG_LANGUAGE": language,
62        }))
63    }
64}
65
66pub fn default_list_branding_provider() -> Arc<dyn PageDataProvider> {
67    Arc::new(DefaultListBrandingProvider)
68}