//! Illustrates downcasting custom structs that implement `SkimItem`. extern crate skim; use skim::prelude::*; #[derive(Debug, Clone)] struct Item { text: String, } impl SkimItem for Item { fn text(&self) -> Cow<'_, str> { Cow::Borrowed(&self.text) } fn preview(&self, _context: PreviewContext) -> ItemPreview { ItemPreview::Text(self.text.clone()) } } fn main() { let options = SkimOptionsBuilder::default() .height("50%") .multi(true) .preview("") .build() .unwrap(); let (tx, rx): (SkimItemSender, SkimItemReceiver) = unbounded(); tx.send(vec![ Arc::new(Item { text: "a".into() }) as Arc, Arc::new(Item { text: "b".into() }) as Arc, Arc::new(Item { text: "c".into() }) as Arc, ]) .unwrap(); drop(tx); let selected_items = Skim::run_with(options, Some(rx)) .map(|out| out.selected_items) .unwrap_or_default() .iter() .map(|selected_item| selected_item.downcast_item::().unwrap().to_owned()) .collect::>(); for item in selected_items { println!("{item:?}"); } }