nostralink 0.2.1

Linked data library for nostr
Documentation
//! LD builder module

pub mod jsonld_serde;
#[allow(non_snake_case)]
pub mod nostralink;
pub mod schema_org;

pub use nostralink::*;
pub use schema_org::media::{ImageObject, VideoObject};

use crate::ldevents::jsonld_event_builder;
use nostr::EventBuilder;
use serde_json::Value;

#[allow(unused_imports)]
use strum::IntoEnumIterator;

use strum_macros::EnumIter;

/// Nostralink object trait.
#[enum_delegate::register]
pub trait NostraObject {
    /// Returns the serde_json Value for this object
    fn value(&mut self) -> Result<Value, serde_json::Error>;

    /// Object type
    fn otype(&self) -> NObject {
        NObject::SocialPost
    }

    /// Object name in a given language
    fn name(&self, _lang_tag: &str) -> Option<String> {
        None
    }

    /// Description
    fn description(&self, _lang_tag: &str) -> Option<String> {
        None
    }

    /// Returns an EventBuilder for this object
    fn event_builder(&mut self) -> Result<EventBuilder, serde_json::Error> {
        Ok(jsonld_event_builder(self.value()?, None))
    }
}

/// Object type
#[derive(EnumIter, Debug)]
pub enum NObject {
    SocialPost,
    Post,
    Article,
    EventReaction,
    VideoObject,
    Note,
    Meme,
    MemesCollection,
}

impl NObject {
    pub fn to_string(&self) -> String {
        match self {
            NObject::SocialPost => "Post".to_string(),
            NObject::Article => "Article".to_string(),
            NObject::VideoObject => "Video".to_string(),
            _ => "".to_string(),
        }
    }

    pub fn description(&self) -> String {
        match self {
            _ => "".to_string(),
        }
    }
}

/// An iterable catalog of objects implementing [`trait@NostraObject`]
#[enum_delegate::implement(NostraObject)]
#[derive(EnumIter, Debug)]
pub enum NostraCatalog {
    Post(Post),
    Note(Note),
    Meme(Meme),
    MemesCollection(MemesCollection),
}

#[test]
fn objt_iter() {
    for otype in NostraCatalog::iter() {
        println!("Name: {:?}", otype.name("en"));
        println!("Nom: {:?}", otype.name("fr"));
        println!("descr en: {:?}", otype.description("en"));
        println!("descr fr: {:?}", otype.description("fr"));
    }
}