ass_editor/commands/event_commands/
delete.rs1use 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#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct DeleteEventCommand {
16 pub event_index: usize,
18}
19
20impl DeleteEventCommand {
21 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}