Skip to main content

advent_of_rust/
lib.rs

1#![doc = include_str!("../README.md")]
2pub use paste::paste;
3
4/// Utility macro to declare advent of rust tests.
5///
6/// See crate-level documentation for more information
7///
8/// # Examples
9///
10/// ```ignore
11/// advent_of_rust::advent_of_rust! {
12///   1 => 1234, "Advent of Rust!";
13///   2 => "hello";
14/// }
15/// ```
16#[macro_export]
17macro_rules! advent_of_rust {
18    ($($day:expr => $part_1:expr $(, $part_2:expr)?);* $(;)?) => {
19        use $crate::paste;
20
21        paste! {
22            $(mod [<day_ $day>];)*
23
24            pub fn ignore_clippy_unused_errors() {
25                $(
26                    let _ = [<day_ $day>]::part_1;
27                    $(
28                        let _ = [<day_ $day>]::part_2;
29                        let _ = $part_2;
30                    )?
31                )*
32            }
33
34            #[cfg(test)]
35            mod tests {
36                use super::*;
37                $(
38                    const [<DAY_ $day _INPUT>]: &str = include_str!(concat!("day_", $day, ".txt"));
39
40                    #[test]
41                    fn [<day_ $day _part_1>]() {
42                        assert_eq!([<day_ $day>]::part_1([<DAY_ $day _INPUT>]), $part_1);
43                    }
44
45                    $(
46                        #[test]
47                        fn [<day_ $day _part_2>]() {
48                            assert_eq!([<day_ $day>]::part_2([<DAY_ $day _INPUT>]), $part_2);
49                        }
50                    )?
51                )*
52            }
53        }
54    };
55}