use std::future::Future;
use std::pin::Pin;
use chronon_core::{Result, ScriptContext};
use serde_json::Value;
pub type InvokeFn = fn(
Box<dyn ScriptContext>,
Value,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'static>>;
pub struct ScriptDescriptor {
pub name: &'static str,
pub invoke: InvokeFn,
pub signature_json: &'static str,
pub signature_hash: u64,
}
impl ScriptDescriptor {
pub const fn new(name: &'static str, invoke: InvokeFn) -> Self {
Self {
name,
invoke,
signature_json: "{}",
signature_hash: 0,
}
}
pub const fn with_signature(
name: &'static str,
invoke: InvokeFn,
signature_json: &'static str,
signature_hash: u64,
) -> Self {
Self {
name,
invoke,
signature_json,
signature_hash,
}
}
}
impl std::fmt::Debug for ScriptDescriptor {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ScriptDescriptor")
.field("name", &self.name)
.field("signature_json", &self.signature_json)
.field("signature_hash", &self.signature_hash)
.field("invoke", &"<fn>")
.finish()
}
}
quark::inventory::collect!(ScriptDescriptor);
impl quark::Registrable for ScriptDescriptor {
fn registry_key(&self) -> &str {
self.name
}
}