trinja 0.7.1

HTML templating / SSG for RDF(S) resources
Documentation
use std::sync::Arc;

use minijinja::{State, Value, value::Object};
use taganak_core::graphs::Graph;
use tokio::runtime::Handle;

use crate::{
    ParamsWithEnv,
    res::{object::GraphObject, str_to_term},
};

#[derive(Debug, Clone)]
pub struct GraphFn<'e, G> {
    params: ParamsWithEnv<'e, G>,
}

impl<'e, G> GraphFn<'e, G>
where
    G: Graph + std::fmt::Debug + Sync + 'static,
{
    pub fn new(params: ParamsWithEnv<'e, G>) -> Self {
        Self { params }
    }
}

impl<G> Object for GraphFn<'_, G>
where
    G: Graph + std::fmt::Debug + Sync + 'static,
    Self: 'static,
{
    fn call(
        self: &Arc<Self>,
        _state: &State<'_, '_>,
        args: &[Value],
    ) -> Result<Value, minijinja::Error> {
        if args.is_empty() {
            return Err(minijinja::Error::new(
                minijinja::ErrorKind::MissingArgument,
                "needs subject",
            ));
        }

        if args.len() > 1 {
            return Err(minijinja::Error::new(
                minijinja::ErrorKind::TooManyArguments,
                "too many arguments",
            ));
        }

        let handle = Handle::current();

        handle.block_on(async {
            let subject =
                str_to_term(self.params.clone().to_params(), &args[0].to_string()).unwrap();
            tracing::trace!(?subject, "calld rdf_get on");
            Ok(Value::from_object(GraphObject::new(
                self.params
                    .clone()
                    .base(Some(Arc::new(subject)))
                    .to_params(),
            )))
        })
    }
}