#![allow(unsafe_code)]
#![allow(clippy::indexing_slicing)]
#![allow(clippy::no_mangle_with_rust_abi)]
use std::collections::HashMap;
use std::error::Error;
use std::fmt;
use abi_stable::std_types::RString;
use crate::symbolic::core::Expr;
#[repr(C)]
#[derive(abi_stable::StableAbi, Debug, Clone, PartialEq, Eq)]
pub enum PluginHealth {
Ok,
Warning(RString),
Error(RString),
RequiresReinitialization,
Terminated,
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PluginErrorKind {
NotFound,
IncompatibleVersion,
LoadFailed,
ExecutionFailed,
SerializationError,
InternalError,
}
#[derive(Debug, Clone)]
pub struct PluginError {
pub kind: PluginErrorKind,
pub message: String,
}
impl PluginError {
#[must_use]
pub fn new(
kind: PluginErrorKind,
msg: &str,
) -> Self {
Self {
kind,
message: msg.to_string(),
}
}
}
impl fmt::Display for PluginError {
fn fmt(
&self,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
write!(f, "Plugin Error ({:?}): {}", self.kind, self.message)
}
}
impl Error for PluginError {}
pub trait Plugin: Send + Sync {
fn name(&self) -> &'static str;
fn description(&self) -> &'static str {
""
}
fn api_version(&self) -> &'static str;
fn on_load(&self) -> Result<(), PluginError>;
fn execute(
&self,
command: &str,
args: &Expr,
) -> Result<Expr, PluginError>;
fn health_check(&self) -> PluginHealth;
fn metadata(&self) -> HashMap<String, String> {
HashMap::new()
}
}