use crate::functions::FunctionParser;
use crate::process::ProcessOutput;
use crate::{Environment, Stuart};
use humphrey_json::prelude::*;
use humphrey_json::Value;
use std::path::Path;
pub trait Manager {
fn plugins(&self) -> &[Plugin];
}
pub struct Plugin {
pub name: String,
pub version: String,
pub functions: Vec<Box<dyn FunctionParser>>,
pub parsers: Vec<Box<dyn NodeParser>>,
}
pub trait NodeParser {
fn extensions(&self) -> Vec<&'static str>;
fn parse(&self, contents: &[u8], path: &Path) -> Result<Box<dyn NodeProcessor>, String>;
}
pub trait NodeProcessor {
fn process(&self, processor: &Stuart, env: Environment) -> Result<ProcessOutput, String>;
fn to_json(&self) -> Value {
json!({ "type": "custom" })
}
}
impl<T> Manager for T
where
T: AsRef<[Plugin]>,
{
fn plugins(&self) -> &[Plugin] {
self.as_ref()
}
}
#[macro_export]
macro_rules! declare_plugin {
(
name: $name:expr,
version: $version:expr,
functions: [
$($function:expr),*
],
parsers: [
$($parser:expr),*
],
) => {
#[no_mangle]
pub extern "C" fn _stuart_plugin_init() -> *mut ::stuart_core::plugins::Plugin {
let plugin = ::stuart_core::plugins::Plugin {
name: $name.into(),
version: $version.into(),
functions: vec![
$(
Box::new($function)
),*
],
parsers: vec![
$(
Box::new($parser)
),*
],
};
Box::into_raw(Box::new(plugin))
}
};
}