use std::collections::HashMap;
use termion::event::Key;
use crate::cli::{MultiSentakuAction, SingleSentakuCli};
pub mod cli;
#[derive(Debug)]
pub enum SentakuError {
EmptyList,
Canceled,
NotTTY,
IoError(std::io::Error),
}
impl std::convert::From<std::io::Error> for SentakuError {
fn from(e: std::io::Error) -> SentakuError {
SentakuError::IoError(e)
}
}
pub struct SentakuItem<T> {
label: String,
value: T,
}
impl SentakuItem<String> {
pub fn from_str(label: &str) -> Self {
SentakuItem {
label: String::from(label),
value: String::from(label),
}
}
}
pub enum SentakuAction<'a, T> {
Up,
Down,
Cancel,
Select,
Action(Box<dyn Fn(&'a T) + 'a>),
}
impl<T> SentakuItem<T> {
pub fn new(label: &str, value: T) -> Self {
SentakuItem {
label: String::from(label),
value,
}
}
}
pub fn get_default_keymap<'a, T>() -> HashMap<Key, SentakuAction<'a, T>> {
let mut result = HashMap::new();
result.insert(Key::Up, SentakuAction::Up);
result.insert(Key::Down, SentakuAction::Down);
result.insert(Key::Char('k'), SentakuAction::Up);
result.insert(Key::Char('j'), SentakuAction::Down);
result.insert(Key::Char('\n'), SentakuAction::Select);
result.insert(Key::Ctrl('c'), SentakuAction::Cancel);
result
}
pub fn get_default_multi_sentaku_keymap<'a, T>() -> HashMap<Key, MultiSentakuAction<'a, T>> {
let mut result = HashMap::new();
result.insert(Key::Up, MultiSentakuAction::Up);
result.insert(Key::Down, MultiSentakuAction::Down);
result.insert(Key::Char('k'), MultiSentakuAction::Up);
result.insert(Key::Char('j'), MultiSentakuAction::Down);
result.insert(Key::Char(' '), MultiSentakuAction::Select);
result.insert(Key::Char('\n'), MultiSentakuAction::Finish);
result.insert(Key::Ctrl('c'), MultiSentakuAction::Cancel);
result
}
pub fn wait_for_input_with_keymap<'a, T: Clone>(
stdin: &mut std::io::Stdin,
items: &'a Vec<SentakuItem<T>>,
keymap: HashMap<Key, SentakuAction<'a, T>>,
) -> Result<T, SentakuError> {
let cli = SingleSentakuCli::with_keymap(items, keymap);
cli.wait_for_input(stdin)
}
pub fn wait_for_input<T: Clone>(
stdin: &mut std::io::Stdin,
items: &Vec<SentakuItem<T>>,
) -> Result<T, SentakuError> {
wait_for_input_with_keymap(stdin, items, get_default_keymap())
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}