use super::super::schema_org::lang::*;
use super::lang::lang_jsonld;
use crate::i18n;
use crate::ldbuilder::jsonld_serde::JLDAttr;
use crate::ldbuilder::NostraObject;
use language::Language;
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Post {
#[serde(flatten)]
pub ld: JLDAttr,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename(serialize = "articleBody"))]
body: Option<String>,
headline: Option<String>,
#[serde(rename(serialize = "inLanguage"))]
language: LanguageJLD,
#[serde(skip_serializing_if = "Option::is_none")]
shared_content: Option<Value>,
}
impl Post {
pub fn new(lang: Language) -> Self {
Self {
ld: JLDAttr::for_schema_type("SocialMediaPosting"),
body: None,
headline: None,
language: LanguageJLD { 0: lang },
shared_content: None,
}
}
pub fn body(mut self, body: String) -> Self {
self.body = Some(body.clone());
self
}
pub fn headline(mut self, hl: String) -> Self {
self.headline = Some(hl.clone());
self
}
pub fn shared_content(mut self, value: Value) -> Self {
self.shared_content = Some(value);
self
}
pub fn value(&mut self) -> Result<Value, serde_json::Error> {
serde_json::to_value(self)
}
}
impl std::default::Default for Post {
fn default() -> Self {
Post::new(Language::EnGb)
}
}
impl NostraObject for Post {
fn value(&mut self) -> Result<Value, serde_json::Error> {
serde_json::to_value(self)
}
fn name(&self, lang_tag: &str) -> Option<String> {
Some(i18n::get_or_en(lang_tag).post_name().to_string())
}
fn description(&self, lang_tag: &str) -> Option<String> {
Some(i18n::get_or_en(lang_tag).post_descr().to_string())
}
}
pub fn social_media_post(
headline: String,
body: String,
language: Option<Language>,
) -> Value {
let lang = match language {
Some(l) => l,
None => Language::EnGb,
};
json!({
"@context": "https://schema.org",
"@type": "SocialMediaPosting",
"name": "Article name",
"headline": headline.to_owned(),
"articleBody": body.to_owned(),
"inLanguage": lang_jsonld(lang),
})
}