Skip to main content

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}