use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum PluginCategory {
Source,
Reaction,
Bootstrap,
}
impl std::fmt::Display for PluginCategory {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PluginCategory::Source => write!(f, "source"),
PluginCategory::Reaction => write!(f, "reaction"),
PluginCategory::Bootstrap => write!(f, "bootstrap"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PluginKindEntry {
pub category: PluginCategory,
pub kind: String,
pub config_version: String,
pub config_schema_name: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum PluginStatus {
Loaded,
Active,
Failed,
}
impl std::fmt::Display for PluginStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PluginStatus::Loaded => write!(f, "Loaded"),
PluginStatus::Active => write!(f, "Active"),
PluginStatus::Failed => write!(f, "Failed"),
}
}
}
#[derive(Debug, Clone)]
pub enum PluginEvent {
Loaded {
plugin_id: String,
version: String,
kinds: Vec<PluginKindEntry>,
},
LoadFailed { path: PathBuf, error: String },
}
#[derive(Debug, Clone)]
pub enum PluginFileEvent {
Added(PathBuf),
Changed(PathBuf),
Removed(PathBuf),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn plugin_category_display() {
assert_eq!(PluginCategory::Source.to_string(), "source");
assert_eq!(PluginCategory::Reaction.to_string(), "reaction");
assert_eq!(PluginCategory::Bootstrap.to_string(), "bootstrap");
}
#[test]
fn plugin_status_display() {
assert_eq!(PluginStatus::Loaded.to_string(), "Loaded");
assert_eq!(PluginStatus::Active.to_string(), "Active");
assert_eq!(PluginStatus::Failed.to_string(), "Failed");
}
#[test]
fn plugin_kind_entry_serde_roundtrip() {
let entry = PluginKindEntry {
category: PluginCategory::Source,
kind: "postgres".to_string(),
config_version: "1.0.0".to_string(),
config_schema_name: "PostgresSourceConfig".to_string(),
};
let json = serde_json::to_string(&entry).expect("serialize");
let deserialized: PluginKindEntry = serde_json::from_str(&json).expect("deserialize");
assert_eq!(entry, deserialized);
}
}