cmd_collector/
cmd_collector.rs

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