doku/printers/json/print_array/
comment.rs

1use super::*;
2
3impl Ctxt<'_, '_, '_> {
4    pub(super) fn comment_array(&mut self, size: Option<usize>) {
5        if !self.fmt.auto_comments.array_size {
6            return;
7        }
8
9        let size = if let Some(size) = size {
10            size
11        } else {
12            return;
13        };
14
15        self.out.append_comment(|comment| {
16            if comment.is_empty() {
17                swrite!(comment, "Must");
18            } else {
19                swrite!(comment, "; must");
20            }
21
22            swrite!(
23                comment,
24                " contain exactly {} element{}",
25                size,
26                if size == 1 { "" } else { "s" }
27            );
28        });
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    fn target<T: Document>(array_size: bool) -> String {
37        let fmt = Formatting {
38            auto_comments: AutoComments {
39                array_size,
40                ..Default::default()
41            },
42            ..Default::default()
43        };
44
45        Printer::default().with_formatting(&fmt).print(&T::ty())
46    }
47
48    mod when_hint {
49        use super::*;
50
51        mod is_disabled {
52            use super::*;
53
54            #[test]
55            fn then_doesnt_print_hint() {
56                assert_doc!(
57                    r#"
58                    [
59                      123,
60                      /* ... */
61                    ]
62                    "#,
63                    target::<[usize; 0]>(false)
64                );
65            }
66        }
67
68        mod is_enabled {
69            use super::*;
70
71            #[test]
72            fn then_prints_hint() {
73                assert_doc!(
74                    r#"
75                    // Must contain exactly 0 elements
76                    [
77                      123,
78                      /* ... */
79                    ]
80                    "#,
81                    target::<[usize; 0]>(true)
82                );
83
84                assert_doc!(
85                    r#"
86                    // Must contain exactly 1 element
87                    [
88                      123,
89                      /* ... */
90                    ]
91                    "#,
92                    target::<[usize; 1]>(true)
93                );
94
95                assert_doc!(
96                    r#"
97                    // Must contain exactly 128 elements
98                    [
99                      123,
100                      /* ... */
101                    ]
102                    "#,
103                    target::<[usize; 128]>(true)
104                );
105            }
106        }
107    }
108}