use super::EditorDocument;
use crate::core::errors::{EditorError, Result};
#[cfg(feature = "std")]
use std::sync::Arc;
#[cfg(not(feature = "std"))]
use alloc::string::{String, ToString};
impl EditorDocument {
pub fn initialize_registry(&mut self) -> Result<()> {
use crate::extensions::registry_integration::RegistryIntegration;
let mut integration = RegistryIntegration::new();
crate::extensions::builtin::register_builtin_extensions(&mut integration)?;
self.registry_integration = Some(Arc::new(integration));
Ok(())
}
pub fn registry(&self) -> Option<&ass_core::plugin::ExtensionRegistry> {
self.registry_integration
.as_ref()
.map(|integration| integration.registry())
}
pub fn parse_with_extensions<F, R>(&self, f: F) -> Result<R>
where
F: FnOnce(&ass_core::parser::Script) -> R,
{
let content = self.text();
if let Some(integration) = &self.registry_integration {
let script = ass_core::parser::Script::builder()
.with_registry(integration.registry())
.parse(&content)
.map_err(EditorError::Core)?;
Ok(f(&script))
} else {
let script = ass_core::parser::Script::parse(&content).map_err(EditorError::Core)?;
Ok(f(&script))
}
}
pub fn register_tag_handler(
&mut self,
extension_name: String,
handler: Box<dyn ass_core::plugin::TagHandler>,
) -> Result<()> {
if self.registry_integration.is_none() {
self.initialize_registry()?;
}
let registry_ref =
self.registry_integration
.as_mut()
.ok_or_else(|| EditorError::ExtensionError {
extension: extension_name.clone(),
message: "Registry integration not available".to_string(),
})?;
if let Some(integration) = Arc::get_mut(registry_ref) {
integration.register_custom_tag_handler(extension_name, handler)
} else {
Err(EditorError::ExtensionError {
extension: extension_name,
message: "Cannot modify shared registry integration".to_string(),
})
}
}
pub fn register_section_processor(
&mut self,
extension_name: String,
processor: Box<dyn ass_core::plugin::SectionProcessor>,
) -> Result<()> {
if self.registry_integration.is_none() {
self.initialize_registry()?;
}
let registry_ref =
self.registry_integration
.as_mut()
.ok_or_else(|| EditorError::ExtensionError {
extension: extension_name.clone(),
message: "Registry integration not available".to_string(),
})?;
if let Some(integration) = Arc::get_mut(registry_ref) {
integration.register_custom_section_processor(extension_name, processor)
} else {
Err(EditorError::ExtensionError {
extension: extension_name,
message: "Cannot modify shared registry integration".to_string(),
})
}
}
}