1extern crate skim;
2use skim::prelude::*;
3
4#[derive(Debug, Clone)]
8struct Item {
9 text: String,
10}
11
12impl SkimItem for Item {
13 fn text(&self) -> Cow<'_, str> {
14 Cow::Borrowed(&self.text)
15 }
16
17 fn preview(&self, _context: PreviewContext) -> ItemPreview {
18 ItemPreview::Text(self.text.to_owned())
19 }
20}
21
22pub fn main() {
23 let options = SkimOptionsBuilder::default()
24 .height(Some("50%"))
25 .multi(true)
26 .preview(Some(""))
27 .build()
28 .unwrap();
29
30 let (tx, rx): (SkimItemSender, SkimItemReceiver) = unbounded();
31
32 tx.send(vec![Arc::new(Item { text: "a".to_string() })]).unwrap();
33 tx.send(vec![Arc::new(Item { text: "b".to_string() })]).unwrap();
34 tx.send(vec![Arc::new(Item { text: "c".to_string() })]).unwrap();
35
36 drop(tx);
37
38 let selected_items = Skim::run_with(&options, Some(rx))
39 .map(|out| out.selected_items)
40 .unwrap_or_default()
41 .iter()
42 .map(|selected_item| (**selected_item).as_any().downcast_ref::<Item>().unwrap().to_owned())
43 .collect::<Vec<Item>>();
44
45 for item in selected_items {
46 println!("{:?}", item);
47 }
48}