lotabout.skim/examples/custom_item.rs
2026-05-21 18:19:40 +02:00

56 lines
1.5 KiB
Rust

//! Demonstrates using a custom item type with skim.
extern crate skim;
use skim::prelude::*;
struct MyItem {
inner: String,
}
impl SkimItem for MyItem {
fn text(&self) -> Cow<'_, str> {
Cow::Borrowed(&self.inner)
}
fn preview(&self, _context: PreviewContext) -> ItemPreview {
if self.inner.starts_with("color") {
ItemPreview::AnsiText(format!("\x1b[31mhello:\x1b[m\n{}", self.inner))
} else {
ItemPreview::Text(format!("hello:\n{}", self.inner))
}
}
}
fn main() {
let options = SkimOptionsBuilder::default()
.height("50%")
.multi(true)
.preview("") // preview should be specified to enable preview window
.build()
.unwrap();
env_logger::init();
let (tx_item, rx_item): (SkimItemSender, SkimItemReceiver) = unbounded();
let _ = tx_item.send(vec![
Arc::new(MyItem {
inner: "color aaaa".to_string(),
}) as Arc<dyn SkimItem>,
Arc::new(MyItem {
inner: "bbbb".to_string(),
}) as Arc<dyn SkimItem>,
Arc::new(MyItem {
inner: "ccc".to_string(),
}) as Arc<dyn SkimItem>,
]);
drop(tx_item); // so that skim could know when to stop waiting for more items.
let selected_items = Skim::run_with(options, Some(rx_item))
.map(|out| out.selected_items)
.unwrap_or_default();
for item in &selected_items {
println!("{}", item.output());
}
}