use anki_bridge::{AnkiClient, AnkiRequestable, prelude::*}; use crossterm::{ cursor::*, event::{self, Event, KeyCode}, execute, style::*, terminal::*, }; use nanohtml2text::html2text; use std::io::stdout; const GOOD: char = '3'; const AGAIN: char = '1'; fn main() { let anki = AnkiClient::default(); init(&anki); loop { prompt(&anki); } } fn init(anki: &AnkiClient) { clear_screen(); display_prompt_text("Name des Stapels: "); let mut input = "".to_string(); loop { match event::read().unwrap() { Event::Key(e) => match e.code { KeyCode::Char(c) => input = input + &c.to_string(), KeyCode::Enter => break, _ => (), }, _ => (), } } anki.request(GuiDeckReviewRequest { name: input }).unwrap(); } fn prompt(anki: &AnkiClient) { let card = anki.request(GuiCurrentCardRequest {}).unwrap(); clear_screen(); display_html(&card.question); loop { match event::read().unwrap() { Event::Key(e) => match e.code { KeyCode::Enter => break, _ => (), }, e => (), }; } anki.request(GuiShowAnswerRequest {}).unwrap(); clear_screen(); { let length = html2text(&card.question).len(); let text = &html2text(&card.answer)[(2 + length)..]; display_text(&text); } display_prompt_text(":"); let ease = loop { let ease = match event::read().unwrap() { Event::Key(e) => match e.code { KeyCode::Char(AGAIN) => break Ease::Again, KeyCode::Char(GOOD) => break Ease::Good, _ => (), }, e => (), }; }; anki.request(GuiAnswerCardRequest { ease: ease }).unwrap(); event::read().unwrap(); } fn clear_screen() { execute!(stdout(), Clear(ClearType::All), MoveTo(0, 0)); } fn display_prompt_text(text: &str) { execute!( stdout(), SetForegroundColor(Color::Blue), Print(text), ResetColor ); } fn display_html(html: &str) { let text = html2text(html); display_text(&text); } fn display_text(text: &str) { execute!( stdout(), SetForegroundColor(Color::DarkYellow), Print(text), ResetColor ); }