ippsec 0.1.0

An interactive tool to navigate https://ippsec.rocks/ videos
use skim::prelude::*;

use crate::video::Video;

impl SkimItem for Video {
    fn text(&self) -> Cow<str> {
        let text = match self {
            Video::Academy(a) => format!("{} [{}] -- {}", &a.machine, &a.tag, &a.line),
            Video::Youtube(y) => format!("{} [{}] -- {}", &y.machine, &y.tag, &y.line),
        };
        Cow::Owned(text)
    }
}

pub fn select(videos: Vec<Video>) -> Vec<Video> {
    let (tx, rx): (SkimItemSender, SkimItemReceiver) = unbounded();

    for video in videos {
        tx.send(Arc::new(video)).unwrap();
    }

    let options = SkimOptionsBuilder::default()
        .height(Some("50%"))
        .multi(true)
        .bind(vec!["alt-z:deselect-all"])
        .build()
        .unwrap();

    drop(tx);

    Skim::run_with(&options, Some(rx))
        .map(|out| out.selected_items)
        .unwrap_or_else(Vec::new)
        .iter()
        .map(|selected_item| {
            (**selected_item)
                .as_any()
                .downcast_ref::<Video>()
                .unwrap()
                .to_owned()
        })
        .collect::<Vec<Video>>()
}