cmd_collector/
cmd_collector.rs1extern crate skim;
2use reader::CommandCollector;
3use skim::prelude::*;
4
5struct BasicSkimItem {
6 value: String,
7}
8
9impl SkimItem for BasicSkimItem {
10 fn text(&self) -> Cow<'_, str> {
11 Cow::Borrowed(&self.value)
12 }
13}
14
15struct BasicCmdCollector {
16 pub items: Vec<String>,
17}
18
19impl CommandCollector for BasicCmdCollector {
20 fn invoke(&mut self, _cmd: &str, _components_to_stop: Arc<AtomicUsize>) -> (SkimItemReceiver, Sender<i32>) {
21 let (tx, rx) = unbounded();
22 let (tx_interrupt, _rx_interrupt) = unbounded();
23 while let Some(value) = self.items.pop() {
24 let item = BasicSkimItem { value };
25 tx.send(Arc::from(item) as Arc<dyn SkimItem>).unwrap();
26 }
27
28 (rx, tx_interrupt)
29 }
30}
31
32fn main() {
33 let cmd_collector = BasicCmdCollector {
34 items: vec![String::from("foo"), String::from("bar"), String::from("baz")],
35 };
36 let options = SkimOptionsBuilder::default()
37 .cmd_collector(Rc::from(RefCell::from(cmd_collector)))
38 .build()
39 .unwrap();
40
41 let selected_items = Skim::run_with(options, None)
42 .map(|out| out.selected_items)
43 .unwrap_or_default();
44
45 for item in selected_items.iter() {
46 println!("{}", item.output());
47 }
48}