use crate::core::Result;
use crate::events::DocumentEvent;
use super::command::{ExtensionCommand, ExtensionResult, ExtensionState, MessageLevel};
use super::context::ExtensionContext;
use super::info::ExtensionInfo;
#[cfg(feature = "std")]
use std::collections::HashMap;
#[cfg(not(feature = "std"))]
use alloc::{collections::BTreeMap as HashMap, string::String, vec::Vec};
pub trait EditorExtension: Send + Sync {
fn info(&self) -> &ExtensionInfo;
fn initialize(&mut self, context: &mut dyn ExtensionContext) -> Result<()>;
fn shutdown(&mut self, context: &mut dyn ExtensionContext) -> Result<()>;
fn state(&self) -> ExtensionState;
fn execute_command(
&mut self,
command_id: &str,
args: &HashMap<String, String>,
context: &mut dyn ExtensionContext,
) -> Result<ExtensionResult>;
fn commands(&self) -> Vec<ExtensionCommand> {
Vec::new()
}
fn handle_event(
&mut self,
_event: &DocumentEvent,
_context: &mut dyn ExtensionContext,
) -> Result<()> {
Ok(())
}
fn config_schema(&self) -> HashMap<String, String> {
HashMap::new()
}
fn validate_config(&self, _config: &HashMap<String, String>) -> Result<()> {
Ok(())
}
fn pause(&mut self) -> Result<()> {
Ok(())
}
fn resume(&mut self) -> Result<()> {
Ok(())
}
fn get_data(&self, _key: &str) -> Option<String> {
None
}
fn set_data(&mut self, _key: String, _value: String) -> Result<()> {
Ok(())
}
}
pub trait MessageHandler: Send + Sync {
fn show(&mut self, message: &str, level: MessageLevel) -> Result<()>;
}
#[cfg(feature = "std")]
pub struct StdMessageHandler;
#[cfg(feature = "std")]
impl MessageHandler for StdMessageHandler {
fn show(&mut self, message: &str, level: MessageLevel) -> Result<()> {
match level {
MessageLevel::Error => eprintln!("[ERROR] {message}"),
MessageLevel::Warning => eprintln!("[WARN] {message}"),
MessageLevel::Info => println!("[INFO] {message}"),
MessageLevel::Success => println!("[SUCCESS] {message}"),
}
Ok(())
}
}
#[cfg(not(feature = "std"))]
pub struct NoOpMessageHandler;
#[cfg(not(feature = "std"))]
impl MessageHandler for NoOpMessageHandler {
fn show(&mut self, _message: &str, _level: MessageLevel) -> Result<()> {
Ok(())
}
}