quarto_error_reporting/macros.rs
1//! Macros for creating diagnostic messages.
2
3/// Create a generic error with automatic file and line information.
4///
5/// This macro is for migration purposes - it creates an error with code Q-0-99 (quarto-error-code-audit-ignore)
6/// and automatically includes the file and line number where the error was created.
7///
8/// # Example
9///
10/// ```
11/// use quarto_error_reporting::generic_error;
12///
13/// let error = generic_error!("Found unexpected attribute");
14/// assert_eq!(error.code, Some("Q-0-99".to_string())); // quarto-error-code-audit-ignore
15/// assert!(error.title.contains("Found unexpected attribute"));
16/// assert!(error.title.contains(file!()));
17/// ```
18#[macro_export]
19macro_rules! generic_error {
20 ($message:expr) => {
21 $crate::DiagnosticMessageBuilder::generic_error($message, file!(), line!())
22 };
23}
24
25/// Create a generic warning with automatic file and line information.
26///
27/// This macro is for migration purposes - it creates a warning with code Q-0-99 (quarto-error-code-audit-ignore)
28/// and automatically includes the file and line number where the warning was created.
29///
30/// # Example
31///
32/// ```
33/// use quarto_error_reporting::generic_warning;
34///
35/// let warning = generic_warning!("Caption found without table");
36/// assert_eq!(warning.code, Some("Q-0-99".to_string())); // quarto-error-code-audit-ignore
37/// assert!(warning.title.contains("Caption found without table"));
38/// assert!(warning.title.contains(file!()));
39/// ```
40#[macro_export]
41macro_rules! generic_warning {
42 ($message:expr) => {
43 $crate::DiagnosticMessageBuilder::generic_warning($message, file!(), line!())
44 };
45}
46
47#[cfg(test)]
48mod tests {
49 use crate::DiagnosticKind;
50
51 #[test]
52 fn test_generic_error_macro() {
53 let error = generic_error!("Test error message");
54
55 assert_eq!(error.kind, DiagnosticKind::Error);
56 assert_eq!(error.code, Some("Q-0-99".to_string())); // quarto-error-code-audit-ignore
57 assert!(error.title.contains("Test error message"));
58 assert!(error.title.contains(file!()));
59 // Line number is included but varies depending on where macro is called
60 assert!(error.title.contains(':'));
61 }
62
63 #[test]
64 fn test_generic_warning_macro() {
65 let warning = generic_warning!("Test warning message");
66
67 assert_eq!(warning.kind, DiagnosticKind::Warning);
68 assert_eq!(warning.code, Some("Q-0-99".to_string())); // quarto-error-code-audit-ignore
69 assert!(warning.title.contains("Test warning message"));
70 assert!(warning.title.contains(file!()));
71 }
72
73 #[test]
74 fn test_macro_with_format() {
75 let value = 42;
76 let error = generic_error!(format!("Invalid value: {}", value));
77
78 assert!(error.title.contains("Invalid value: 42"));
79 }
80
81 #[test]
82 fn test_macro_error_can_be_rendered() {
83 let error = generic_error!("Render test");
84 let text = error.to_text(None);
85
86 assert!(text.contains("[Q-0-99]")); // quarto-error-code-audit-ignore
87 assert!(text.contains("Render test"));
88 }
89
90 #[test]
91 fn test_macro_warning_can_be_rendered() {
92 let warning = generic_warning!("Warning test");
93 let text = warning.to_text(None);
94
95 assert!(text.contains("[Q-0-99]")); // quarto-error-code-audit-ignore
96 assert!(text.contains("Warning test"));
97 }
98}