nostralink 0.2.4

Linked data library for nostr
Documentation
use super::manager::{RdfEventsStore, RdfStoreError};
use super::prelude::*;
use crate::ldbuilder::NostrFilterBuilder;
use nostr::{Filter, SubscriptionId, Timestamp};

pub trait NostrFilterManager {
    fn filter_save<T: Into<String>>(
        &self,
        filter: Filter,
        id_salt: T,
    ) -> Result<(), RdfStoreError>;
}

pub const PRED_FILTER_KIND: NamedNodeRef<'static> =
    NamedNodeRef::new_unchecked("http://nostralink.org/NostrFilter#kind");

impl NostrFilterManager for RdfEventsStore {
    fn filter_save<T: Into<String>>(
        &self,
        filter: Filter,
        id_salt: T,
    ) -> Result<(), RdfStoreError> {
        let sub_id = SubscriptionId::new(id_salt);

        let fobj = NostrFilterBuilder::from_filter(&filter)
            .subscription_id(sub_id.to_string())
            .since(filter.since.unwrap_or(Timestamp::now()).as_secs())
            .until(filter.until.unwrap_or(Timestamp::now()).as_secs())
            .kinds(
                filter
                    .kinds
                    .unwrap_or_default()
                    .iter()
                    .map(|k| k.as_u16())
                    .collect::<Vec<_>>(),
            )
            .authors(
                filter
                    .authors
                    .unwrap_or_default()
                    .iter()
                    .map(|pk| pk.to_hex())
                    .collect::<Vec<_>>(),
            )
            .build()
            .unwrap();

        self.feed_nobject(Box::new(fobj) as Box<dyn NostraObject + Send>)?;

        Ok(())
    }
}