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