Skip to main content

mofa_plugins/rhai_runtime/
types.rs

1//! Rhai Plugin Types
2//!
3//! Type definitions for Rhai runtime plugins
4
5use anyhow::Result;
6use rhai::Dynamic;
7use serde::{Deserialize, Serialize};
8use std::collections::HashMap;
9use std::path::PathBuf;
10
11// ============================================================================
12// Plugin Metadata
13// ============================================================================
14
15/// Plugin metadata extracted from script
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct PluginMetadata {
18    /// Plugin ID
19    pub id: String,
20    /// Plugin name
21    pub name: String,
22    /// Plugin version
23    pub version: String,
24    /// Plugin description
25    pub description: String,
26    /// Plugin author
27    pub author: Option<String>,
28    /// Plugin homepage
29    pub homepage: Option<String>,
30    /// Required capabilities
31    pub capabilities: Vec<String>,
32    /// Plugin dependencies
33    pub dependencies: Vec<String>,
34    /// Creation time
35    pub created_at: u64,
36    /// Last modified time
37    pub modified_at: u64,
38    /// Script path (if loaded from file)
39    pub path: Option<PathBuf>,
40}
41
42impl Default for PluginMetadata {
43    fn default() -> Self {
44        let now = chrono::Utc::now().timestamp() as u64;
45        Self {
46            id: uuid::Uuid::now_v7().to_string(),
47            name: "unknown".to_string(),
48            version: "0.0.0".to_string(),
49            description: "".to_string(),
50            author: None,
51            homepage: None,
52            capabilities: Vec::new(),
53            dependencies: Vec::new(),
54            created_at: now,
55            modified_at: now,
56            path: None,
57        }
58    }
59}
60
61impl PluginMetadata {
62    /// Create new plugin metadata with minimal required fields
63    pub fn new(id: &str, name: &str, version: &str) -> Self {
64        let mut meta = Self::default();
65        meta.id = id.to_string();
66        meta.name = name.to_string();
67        meta.version = version.to_string();
68        meta
69    }
70
71    /// Load metadata from Rhai global variables
72    pub fn from_rhai_vars(_vars: &HashMap<String, Dynamic>) -> Result<Self> {
73        // Simplified for now - will implement properly later
74        Ok(Self::default())
75    }
76}
77
78// ============================================================================
79// Plugin Error Type
80// ============================================================================
81
82/// Rhai plugin error type
83#[derive(thiserror::Error, Debug)]
84pub enum RhaiPluginError {
85    /// Script compilation error
86    #[error("Compilation error: {0}")]
87    CompilationError(String),
88
89    /// Script execution error
90    #[error("Execution error: {0}")]
91    ExecutionError(String),
92
93    /// Missing required function
94    #[error("Missing required function: {0}")]
95    MissingFunction(String),
96
97    /// Invalid metadata format
98    #[error("Invalid metadata format: {0}")]
99    InvalidMetadata(String),
100
101    /// File IO error
102    #[error("File IO error: {0}")]
103    IoError(#[from] std::io::Error),
104
105    /// Rhai engine error
106    #[error("Rhai error: {0}")]
107    RhaiError(String),
108
109    /// JSON ser/de error
110    #[error("JSON error: {0}")]
111    JsonError(#[from] serde_json::Error),
112
113    /// Other error
114    #[error("Other: {0}")]
115    Other(#[from] anyhow::Error),
116}
117
118/// Rhai plugin result type
119pub type RhaiPluginResult<T = ()> = Result<T, RhaiPluginError>;
120
121// ============================================================================
122// Plugin Capabilities
123// ============================================================================
124
125/// Plugin capabilities
126#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
127pub enum PluginCapability {
128    /// Basic execution capability
129    Execution,
130    /// File system access
131    FileSystem,
132    /// Network access
133    Network,
134    /// System command execution
135    SystemCommand,
136    /// Event subscription
137    EventSubscription,
138    /// Plugin management
139    PluginManagement,
140}
141
142impl ToString for PluginCapability {
143    fn to_string(&self) -> String {
144        match self {
145            PluginCapability::Execution => "execution",
146            PluginCapability::FileSystem => "file_system",
147            PluginCapability::Network => "network",
148            PluginCapability::SystemCommand => "system_command",
149            PluginCapability::EventSubscription => "event_subscription",
150            PluginCapability::PluginManagement => "plugin_management",
151        }
152        .to_string()
153    }
154}