use std::{
any::Any,
fmt,
sync::{Arc, RwLock},
};
use crate::dlt::DltMessage;
pub trait Plugin {
fn name(&self) -> &str;
fn enabled(&self) -> bool;
fn state(&self) -> Arc<RwLock<PluginState>>;
fn process_msg(&mut self, msg: &mut DltMessage) -> bool;
}
impl fmt::Debug for dyn Plugin + Send {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Plugin")
.field("name", &self.name())
.field("enabled", &self.enabled())
.finish()
}
}
type ApplyCommandFn = fn(
internal_data: &Option<Box<dyn Any + Send + Sync>>,
cmd: &str,
params: Option<&serde_json::Map<String, serde_json::Value>>,
cmdCtx: Option<&serde_json::Map<String, serde_json::Value>>,
) -> bool;
pub struct PluginState {
pub generation: u32, pub value: serde_json::Value,
pub apply_command: Option<ApplyCommandFn>,
pub internal_data: Option<Box<dyn Any + Send + Sync>>,
}
impl fmt::Debug for PluginState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PluginState")
.field("generation", &self.generation)
.field("value", &self.value)
.field("apply_command", &self.apply_command.is_some())
.field("internal_data", &self.internal_data.is_some())
.finish()
}
}
impl Default for PluginState {
fn default() -> Self {
PluginState {
generation: 0,
value: serde_json::Value::Null,
apply_command: None,
internal_data: None,
}
}
}