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}