Skip to main content

ass_editor/commands/macros/
event_macros.rs

1//! Event-oriented editing macros (`edit_event!`, `add_event!`).
2
3/// Macro for editing events with multiple field updates
4///
5/// Supports both simple text editing and complex field updates:
6/// - `edit_event!(doc, index, "new text")` - Simple text replacement
7/// - `edit_event!(doc, index, text = "new", start = "0:00:05.00", end = "0:00:10.00")` - Multi-field
8///
9/// # Examples
10///
11/// ```
12/// use ass_editor::{EditorDocument, edit_event};
13///
14/// let content = "[Events]\nDialogue: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,,Old text";
15/// let mut doc = EditorDocument::from_content(content).unwrap();
16///
17/// // Edit event using the macro - this updates the text field
18/// edit_event!(doc, 0, |event| {
19///     vec![("text", "New dialogue text".to_string())]
20/// }).unwrap();
21/// assert!(doc.text().contains("New dialogue text"));
22/// ```
23#[macro_export]
24macro_rules! edit_event {
25    // Simple text replacement: edit_event!(doc, index, "text")
26    ($doc:expr, $index:expr, $text:expr) => {
27        $doc.edit_event_by_index($index, $text)
28    };
29
30    // Multi-field edit: edit_event!(doc, index, field = value, ...)
31    ($doc:expr, $index:expr, $($field:ident = $value:expr),+ $(,)?) => {{
32        let mut builder = $crate::core::EventUpdateBuilder::new();
33        $(
34            builder = edit_event!(@field builder, $field, $value);
35        )+
36        $doc.edit_event_with_builder($index, builder)
37    }};
38
39    // Internal helper for field assignments
40    (@field $builder:expr, text, $value:expr) => {
41        $builder.text($value)
42    };
43    (@field $builder:expr, start, $value:expr) => {
44        $builder.start_time($value)
45    };
46    (@field $builder:expr, end, $value:expr) => {
47        $builder.end_time($value)
48    };
49    (@field $builder:expr, speaker, $value:expr) => {
50        $builder.speaker($value)
51    };
52    (@field $builder:expr, style, $value:expr) => {
53        $builder.style($value)
54    };
55    (@field $builder:expr, layer, $value:expr) => {
56        $builder.layer($value)
57    };
58    (@field $builder:expr, effect, $value:expr) => {
59        $builder.effect($value)
60    };
61}
62
63/// Macro for quickly adding events
64///
65/// # Examples
66///
67/// ```
68/// use ass_editor::{EditorDocument, add_event};
69///
70/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
71/// let mut doc = EditorDocument::from_content("[Events]")?;
72///
73/// add_event!(doc, dialogue {
74///     start_time = "0:00:05.00",
75///     end_time = "0:00:10.00",
76///     text = "Hello world!"
77/// })?;
78///
79/// assert!(doc.text().contains("Hello world!"));
80/// # Ok(())
81/// # }
82/// ```
83#[macro_export]
84macro_rules! add_event {
85    ($doc:expr, dialogue { $($field:ident = $value:expr),+ $(,)? }) => {{
86        let event = $crate::EventBuilder::dialogue()
87            $(.$field($value))*
88            .build()?;
89        $doc.add_event_line(&event)
90    }};
91
92    ($doc:expr, comment { $($field:ident = $value:expr),+ $(,)? }) => {{
93        let event = $crate::EventBuilder::comment()
94            $(.$field($value))*
95            .build()?;
96        $doc.add_event_line(&event)
97    }};
98}