1use std::collections::BTreeSet;
16use std::fmt;
17
18use crate::DisplayIntoIter;
19
20pub struct DisplayBTreeSet<'a, T: fmt::Display> {
25 inner: DisplayIntoIter<'a, T, &'a BTreeSet<T>>,
26}
27
28impl<'a, T: fmt::Display> DisplayBTreeSet<'a, T> {
29 pub fn new(set: &'a BTreeSet<T>) -> Self {
30 Self {
31 inner: DisplayIntoIter::new(set),
32 }
33 }
34
35 pub fn at_most(mut self, limit: Option<usize>) -> Self {
36 self.inner = self.inner.at_most(limit);
37 self
38 }
39
40 pub fn sep(mut self, separator: &'a str) -> Self {
41 self.inner = self.inner.sep(separator);
42 self
43 }
44
45 pub fn braces(mut self, left: &'a str, right: &'a str) -> Self {
46 self.inner = self.inner.braces(left, right);
47 self
48 }
49
50 pub fn ellipsis(mut self, s: &'a str) -> Self {
51 self.inner = self.inner.ellipsis(s);
52 self
53 }
54
55 pub fn elem(mut self, prefix: &'a str, suffix: &'a str) -> Self {
56 self.inner = self.inner.elem(prefix, suffix);
57 self
58 }
59
60 pub fn show_count(mut self) -> Self {
61 self.inner = self.inner.show_count();
62 self
63 }
64
65 pub fn limit(&self) -> usize {
66 self.inner.limit()
67 }
68}
69
70impl<T: fmt::Display> fmt::Display for DisplayBTreeSet<'_, T> {
71 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
72 self.inner.fmt(f)
73 }
74}
75
76pub trait DisplayBTreeSetExt<'a, T: fmt::Display> {
92 fn display(&'a self) -> DisplayBTreeSet<'a, T>;
93
94 fn display_n(&'a self, n: usize) -> DisplayBTreeSet<'a, T> {
96 self.display().at_most(Some(n))
97 }
98}
99
100impl<T> DisplayBTreeSetExt<'_, T> for BTreeSet<T>
101where T: fmt::Display
102{
103 fn display(&self) -> DisplayBTreeSet<'_, T> {
104 DisplayBTreeSet::new(self)
105 }
106}
107
108#[cfg(test)]
109mod tests {
110 use std::collections::BTreeSet;
111
112 use super::DisplayBTreeSet;
113 use crate::DisplayBTreeSetExt;
114
115 #[test]
116 fn test_display_btreeset() {
117 let set = (1..=3).collect::<BTreeSet<_>>();
118 let display = DisplayBTreeSet::new(&set);
119
120 assert_eq!(display.to_string(), "[1,2,3]");
121 }
122
123 #[test]
124 fn test_display_empty_set() {
125 let set = BTreeSet::<i32>::new();
126 let display = DisplayBTreeSet::new(&set);
127
128 assert_eq!(display.to_string(), "[]");
129 }
130
131 #[test]
132 fn test_display_btreeset_with_1_item() {
133 let set = (1..=1).collect::<BTreeSet<_>>();
134 let display = DisplayBTreeSet::new(&set);
135
136 assert_eq!(display.to_string(), "[1]");
137 }
138
139 #[test]
140 fn test_display_btreeset_limit() {
141 let set = (1..=7).collect::<BTreeSet<_>>();
142
143 assert_eq!("[1,2,3,4,..,7]", set.display().to_string());
144 assert_eq!("[1,..,7]", set.display_n(2).to_string());
145 assert_eq!("[..,7]", set.display_n(1).to_string());
146 assert_eq!("[..]", set.display_n(0).to_string());
147 }
148
149 #[test]
150 fn test_display_btreeset_separator_and_braces() {
151 let set = (1..=6).collect::<BTreeSet<_>>();
152
153 assert_eq!("[1, 2, 3, 4, .., 6]", set.display().sep(", ").to_string());
154 assert_eq!(
155 "{1|..|6}",
156 set.display_n(2).sep("|").braces("{", "}").to_string()
157 );
158 assert_eq!(
159 "1,2,3",
160 (1..=3)
161 .collect::<BTreeSet<_>>()
162 .display()
163 .braces("", "")
164 .to_string()
165 );
166 }
167
168 #[test]
169 fn test_display_btreeset_ellipsis_and_elem() {
170 let set = (1..=6).collect::<BTreeSet<_>>();
171
172 assert_eq!("[1,2,3,4,...,6]", set.display().ellipsis("...").to_string());
173 assert_eq!(
174 "['1','2','3','4',..,'6']",
175 set.display().elem("'", "'").to_string()
176 );
177 assert_eq!("[...]", set.display_n(0).ellipsis("...").to_string());
178 }
179
180 #[test]
181 fn test_display_btreeset_show_count() {
182 let set = (1..=7).collect::<BTreeSet<_>>();
183
184 assert_eq!(
185 "[1,2,3,4,..(7 total),7]",
186 set.display().show_count().to_string()
187 );
188 assert_eq!("[..(7 total)]", set.display_n(0).show_count().to_string());
189 assert_eq!(
190 "{'1', '2', '3', '4', ...(7 total), '7'}",
191 set.display()
192 .ellipsis("...")
193 .show_count()
194 .elem("'", "'")
195 .sep(", ")
196 .braces("{", "}")
197 .to_string()
198 );
199 }
200
201 #[test]
202 fn test_display_btreeset_limit_getter_and_large_limit() {
203 let set = (1..=3).collect::<BTreeSet<_>>();
204
205 let display = DisplayBTreeSet::new(&set);
206 assert_eq!(5, display.limit());
207 assert_eq!(10, display.at_most(Some(10)).limit());
208 assert_eq!("[1,2,3]", set.display_n(10).to_string());
209 }
210
211 #[test]
212 fn test_display_btreeset_show_count_without_truncation() {
213 let set = (1..=3).collect::<BTreeSet<_>>();
214 assert_eq!(
215 "[1,2,3]",
216 DisplayBTreeSet::new(&set).show_count().to_string()
217 );
218 }
219}