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(),
)))
})
}
}