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}
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}