nostralink 0.2.1

Linked data library for nostr
Documentation
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};

/// <http://schema.org/SocialMediaPosting>
#[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())
    }
}

/// Create a SocialMediaPosting object
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),
    })
}