Skip to main content

display_more/
display_btreeset.rs

1// Copyright 2021 Datafuse Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::collections::BTreeSet;
16use std::fmt;
17
18use crate::DisplayIntoIter;
19
20/// Implement `Display` for `BTreeSet<T>` if `T` is `Display`.
21///
22/// It outputs at most `limit` elements, excluding those from the 5th to the second-to-last one:
23/// - `DisplayBTreeSet{ set: ... }` outputs: `"[1,2,3,4,..,6]"`.
24pub 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
76/// Implement `Display` for `BTreeSet<T>` if `T` is `Display`.
77///
78/// It outputs at most `MAX` elements, excluding those from the 5th to the second-to-last one:
79/// - `DisplayBTreeSet([1,2,3,4,5,6])` outputs: `"[1,2,3,4,..,6]"`.
80///
81/// # Example
82///
83/// ```rust
84/// use std::collections::BTreeSet;
85///
86/// use display_more::DisplayBTreeSetExt;
87///
88/// let a = (1..=6).collect::<BTreeSet<_>>();
89/// assert_eq!(a.display().to_string(), "[1,2,3,4,..,6]");
90/// ```
91pub trait DisplayBTreeSetExt<'a, T: fmt::Display> {
92    fn display(&'a self) -> DisplayBTreeSet<'a, T>;
93
94    /// Display at most `n` elements.
95    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}