use super::EditorDocument;
use crate::core::errors::Result;
use crate::core::position::Range;
#[cfg(feature = "stream")]
use crate::core::errors::EditorError;
#[cfg(feature = "stream")]
use crate::core::position::Position;
#[cfg(feature = "stream")]
use ass_core::parser::script::ScriptDeltaOwned;
#[cfg(feature = "stream")]
use ass_core::parser::Script;
#[cfg(feature = "stream")]
use core::ops::Range as StdRange;
#[cfg(all(feature = "stream", not(feature = "std")))]
use alloc::format;
impl EditorDocument {
pub fn edit_safe(&mut self, range: Range, new_text: &str) -> Result<()> {
#[cfg(feature = "stream")]
{
match self.edit_incremental(range, new_text) {
Ok(_) => return Ok(()),
Err(_e) => {
#[cfg(feature = "std")]
eprintln!("Incremental edit failed, falling back to regular replace: {_e}");
}
}
}
self.replace(range, new_text)
}
#[cfg(feature = "stream")]
pub fn edit_event_incremental(
&mut self,
event_text: &str,
new_text: &str,
) -> Result<ScriptDeltaOwned> {
let content = self.text();
if let Some(pos) = content.find(event_text) {
let range = Range::new(Position::new(pos), Position::new(pos + event_text.len()));
self.edit_incremental(range, new_text)
} else {
Err(EditorError::ValidationError {
message: format!("Event text not found: {event_text}"),
})
}
}
#[cfg(feature = "stream")]
pub fn parse_with_delta_tracking<F, R>(
&self,
range: Option<StdRange<usize>>,
new_text: Option<&str>,
f: F,
) -> Result<R>
where
F: FnOnce(&Script, Option<&ScriptDeltaOwned>) -> R,
{
let content = self.text();
let script = Script::parse(&content).map_err(EditorError::from)?;
if let (Some(range), Some(text)) = (range, new_text) {
match script.parse_partial(range, text) {
Ok(delta) => Ok(f(&script, Some(&delta))),
Err(_) => {
Ok(f(&script, None))
}
}
} else {
Ok(f(&script, None))
}
}
}