mirror of
https://github.com/lotabout/skim.git
synced 2026-09-10 07:16:23 -04:00
51 lines
1.2 KiB
Rust
51 lines
1.2 KiB
Rust
//! 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<dyn SkimItem>,
|
|
Arc::new(Item { text: "b".into() }) as Arc<dyn SkimItem>,
|
|
Arc::new(Item { text: "c".into() }) as Arc<dyn SkimItem>,
|
|
])
|
|
.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::<Item>().unwrap().to_owned())
|
|
.collect::<Vec<Item>>();
|
|
|
|
for item in selected_items {
|
|
println!("{item:?}");
|
|
}
|
|
}
|