use crate::core::{EditorDocument, Result};
use crate::events::DocumentEvent;
use super::command::{ExtensionCommand, MessageLevel};
use super::manager::ExtensionManager;
#[cfg(not(feature = "std"))]
use alloc::string::String;
#[cfg(all(not(feature = "multi-thread"), feature = "std"))]
use std::collections::HashMap;
#[cfg(all(not(feature = "multi-thread"), not(feature = "std")))]
use alloc::collections::BTreeMap as HashMap;
pub trait ExtensionContext {
fn current_document(&self) -> Option<&EditorDocument>;
fn current_document_mut(&mut self) -> Option<&mut EditorDocument>;
fn send_event(&mut self, event: DocumentEvent) -> Result<()>;
fn get_config(&self, key: &str) -> Option<String>;
fn set_config(&mut self, key: String, value: String) -> Result<()>;
fn register_command(&mut self, command: ExtensionCommand) -> Result<()>;
fn show_message(&mut self, message: &str, level: MessageLevel) -> Result<()>;
fn get_extension_data(&self, extension_name: &str, key: &str) -> Option<String>;
fn set_extension_data(&mut self, key: String, value: String) -> Result<()>;
}
pub struct EditorContext<'a> {
pub document: Option<&'a mut EditorDocument>,
#[cfg(feature = "multi-thread")]
pub manager: ExtensionManager,
#[cfg(not(feature = "multi-thread"))]
pub manager: &'a mut ExtensionManager,
#[cfg(not(feature = "multi-thread"))]
pub manager_mut_state: alloc::rc::Rc<core::cell::RefCell<HashMap<String, String>>>,
pub extension_name: String,
}
impl ExtensionContext for EditorContext<'_> {
fn current_document(&self) -> Option<&EditorDocument> {
self.document.as_deref()
}
fn current_document_mut(&mut self) -> Option<&mut EditorDocument> {
self.document.as_deref_mut()
}
fn send_event(&mut self, _event: DocumentEvent) -> Result<()> {
#[cfg(feature = "std")]
{
eprintln!("Extension {} sent event: {:?}", self.extension_name, _event);
}
Ok(())
}
fn get_config(&self, key: &str) -> Option<String> {
#[cfg(feature = "multi-thread")]
{
self.manager.get_config(key)
}
#[cfg(not(feature = "multi-thread"))]
{
self.manager.get_config(key)
}
}
fn set_config(&mut self, key: String, value: String) -> Result<()> {
#[cfg(feature = "multi-thread")]
{
self.manager.set_config(key.clone(), value.clone());
}
#[cfg(not(feature = "multi-thread"))]
{
self.manager_mut_state.borrow_mut().insert(key, value);
}
Ok(())
}
fn register_command(&mut self, _command: ExtensionCommand) -> Result<()> {
#[cfg(feature = "std")]
{
eprintln!(
"Extension {} registered command: {}",
self.extension_name, _command.id
);
}
Ok(())
}
fn show_message(&mut self, _message: &str, _level: MessageLevel) -> Result<()> {
#[cfg(feature = "std")]
{
match _level {
MessageLevel::Info => eprintln!("[INFO] {}: {}", self.extension_name, _message),
MessageLevel::Warning => eprintln!("[WARN] {}: {}", self.extension_name, _message),
MessageLevel::Error => eprintln!("[ERROR] {}: {}", self.extension_name, _message),
MessageLevel::Success => {
eprintln!("[SUCCESS] {}: {}", self.extension_name, _message)
}
}
}
Ok(())
}
fn get_extension_data(&self, extension_name: &str, key: &str) -> Option<String> {
self.manager.get_extension_data(extension_name, key)
}
fn set_extension_data(&mut self, key: String, value: String) -> Result<()> {
self.manager
.set_extension_data(self.extension_name.clone(), key, value);
Ok(())
}
}