downcast/
downcast.rs

1extern crate skim;
2use skim::prelude::*;
3
4/// This example illustrates downcasting custom structs that implement
5/// `SkimItem` after calling `Skim::run_with`.
6
7#[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}