From b5b378093c7e7dacdde7a54451554cb70713c949 Mon Sep 17 00:00:00 2001 From: Jacobtread Date: Thu, 18 Jan 2024 14:02:42 +1300 Subject: [PATCH 1/2] feat: many items by iterator instead of slice --- src/prompts/fuzzy_select.rs | 12 ++++++++---- src/prompts/multi_select.rs | 20 ++++++++++++-------- src/prompts/select.rs | 13 +++++++++---- src/prompts/sort.rs | 12 ++++++++---- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/prompts/fuzzy_select.rs b/src/prompts/fuzzy_select.rs index 706cd5e..48da0c4 100644 --- a/src/prompts/fuzzy_select.rs +++ b/src/prompts/fuzzy_select.rs @@ -81,10 +81,14 @@ impl FuzzySelect<'_> { } /// Adds multiple items to the fuzzy selector. - pub fn items(mut self, items: &[T]) -> Self { - for item in items { - self.items.push(item.to_string()); - } + pub fn items(mut self, items: I) -> Self + where + T: ToString, + I: IntoIterator, + { + self.items + .extend(items.into_iter().map(|item| item.to_string())); + self } diff --git a/src/prompts/multi_select.rs b/src/prompts/multi_select.rs index 2afa828..9b31ad1 100644 --- a/src/prompts/multi_select.rs +++ b/src/prompts/multi_select.rs @@ -101,17 +101,21 @@ impl MultiSelect<'_> { } /// Adds multiple items to the selector. - pub fn items(mut self, items: &[T]) -> Self { - for item in items { - self.items.push(item.to_string()); - self.defaults.push(false); - } - self + pub fn items(self, items: I) -> Self + where + T: ToString, + I: IntoIterator, + { + self.items_checked(items.into_iter().map(|item| (item, false))) } /// Adds multiple items to the selector with checked state - pub fn items_checked(mut self, items: &[(T, bool)]) -> Self { - for &(ref item, checked) in items { + pub fn items_checked(mut self, items: I) -> Self + where + T: ToString, + I: IntoIterator, + { + for (item, checked) in items.into_iter() { self.items.push(item.to_string()); self.defaults.push(checked); } diff --git a/src/prompts/select.rs b/src/prompts/select.rs index b932c6b..67ebf21 100644 --- a/src/prompts/select.rs +++ b/src/prompts/select.rs @@ -99,14 +99,19 @@ impl Select<'_> { /// ``` pub fn item(mut self, item: T) -> Self { self.items.push(item.to_string()); + self } /// Adds multiple items to the selector. - pub fn items(mut self, items: &[T]) -> Self { - for item in items { - self.items.push(item.to_string()); - } + pub fn items(mut self, items: I) -> Self + where + T: ToString, + I: IntoIterator, + { + self.items + .extend(items.into_iter().map(|item| item.to_string())); + self } diff --git a/src/prompts/sort.rs b/src/prompts/sort.rs index e385685..16f29ff 100644 --- a/src/prompts/sort.rs +++ b/src/prompts/sort.rs @@ -83,10 +83,14 @@ impl Sort<'_> { } /// Adds multiple items to the selector. - pub fn items(mut self, items: &[T]) -> Self { - for item in items { - self.items.push(item.to_string()); - } + pub fn items(mut self, items: I) -> Self + where + T: ToString, + I: IntoIterator, + { + self.items + .extend(items.into_iter().map(|item| item.to_string())); + self } From c834f0e0755a785c25e2f2a50493a2b39f815225 Mon Sep 17 00:00:00 2001 From: Jacobtread Date: Thu, 18 Jan 2024 14:21:22 +1300 Subject: [PATCH 2/2] test: add tests for items iterators --- src/prompts/fuzzy_select.rs | 8 ++++++++ src/prompts/multi_select.rs | 8 ++++++++ src/prompts/select.rs | 15 ++++++++++----- src/prompts/sort.rs | 8 ++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/prompts/fuzzy_select.rs b/src/prompts/fuzzy_select.rs index 48da0c4..9f06798 100644 --- a/src/prompts/fuzzy_select.rs +++ b/src/prompts/fuzzy_select.rs @@ -408,4 +408,12 @@ mod tests { let _ = fuzzy_select.clone(); } + + #[test] + fn test_iterator() { + let items = ["First", "Second", "Third"]; + let iterator = items.iter().skip(1); + + assert_eq!(FuzzySelect::new().items(iterator).items, &items[1..]); + } } diff --git a/src/prompts/multi_select.rs b/src/prompts/multi_select.rs index 9b31ad1..42b301d 100644 --- a/src/prompts/multi_select.rs +++ b/src/prompts/multi_select.rs @@ -386,4 +386,12 @@ mod tests { let _ = multi_select.clone(); } + + #[test] + fn test_iterator() { + let items = ["First", "Second", "Third"]; + let iterator = items.iter().skip(1); + + assert_eq!(MultiSelect::new().items(iterator).items, &items[1..]); + } } diff --git a/src/prompts/select.rs b/src/prompts/select.rs index 67ebf21..872975d 100644 --- a/src/prompts/select.rs +++ b/src/prompts/select.rs @@ -368,7 +368,7 @@ mod tests { let selections = vec!["a".to_string(), "b".to_string()]; assert_eq!( - Select::new().default(0).items(&selections[..]).items, + Select::new().default(0).items(&selections).items, selections ); } @@ -380,9 +380,14 @@ mod tests { let selections = &[a, b]; - assert_eq!( - Select::new().default(0).items(&selections[..]).items, - selections - ); + assert_eq!(Select::new().default(0).items(selections).items, selections); + } + + #[test] + fn test_iterator() { + let items = ["First", "Second", "Third"]; + let iterator = items.iter().skip(1); + + assert_eq!(Select::new().default(0).items(iterator).items, &items[1..]); } } diff --git a/src/prompts/sort.rs b/src/prompts/sort.rs index 16f29ff..4b1b0c8 100644 --- a/src/prompts/sort.rs +++ b/src/prompts/sort.rs @@ -377,4 +377,12 @@ mod tests { let _ = sort.clone(); } + + #[test] + fn test_iterator() { + let items = ["First", "Second", "Third"]; + let iterator = items.iter().skip(1); + + assert_eq!(Sort::new().items(iterator).items, &items[1..]); + } }