Skip to main content

ass_editor/commands/event_commands/
delete.rs

1//! Command to delete a single event from an ASS document.
2
3use super::helpers::collect_event_lines;
4use crate::commands::{CommandResult, EditorCommand};
5use crate::core::{EditorDocument, EditorError, Position, Range, Result};
6
7#[cfg(not(feature = "std"))]
8use alloc::{format, string::ToString};
9
10/// Command to delete a single event from the ASS document
11///
12/// Removes an event (Dialogue or Comment) at the specified index from the `[Events]` section.
13/// The index is 0-based and includes both Dialogue and Comment events.
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct DeleteEventCommand {
16    /// Index of the event to delete
17    pub event_index: usize,
18}
19
20impl DeleteEventCommand {
21    /// Create a new delete event command
22    pub fn new(event_index: usize) -> Self {
23        Self { event_index }
24    }
25}
26
27impl EditorCommand for DeleteEventCommand {
28    fn execute(&self, document: &mut EditorDocument) -> Result<CommandResult> {
29        let content = document.text();
30        let delete_range = collect_event_lines(&content)?
31            .into_iter()
32            .find_map(|event_line| {
33                (event_line.index == self.event_index).then(|| {
34                    Range::new(
35                        Position::new(event_line.start),
36                        Position::new(event_line.end_with_newline),
37                    )
38                })
39            });
40
41        if let Some(range) = delete_range {
42            document.delete(range)?;
43            Ok(CommandResult::success_with_change(
44                Range::new(range.start, range.start),
45                range.start,
46            ))
47        } else {
48            Err(EditorError::command_failed(format!(
49                "Event index {} not found",
50                self.event_index
51            )))
52        }
53    }
54
55    fn description(&self) -> &str {
56        "Delete event"
57    }
58
59    fn memory_usage(&self) -> usize {
60        core::mem::size_of::<Self>()
61    }
62}