use tek_tui::{*, tek_layout::{*, tek_engine::*}}; use tek_edn::*; use std::sync::{Arc, RwLock}; use crossterm::event::{*, KeyCode::*}; const EDN: &'static [&'static str] = &[ include_str!("edn01.edn"), include_str!("edn02.edn"), ]; fn main () -> Usually<()> { let state = Arc::new(RwLock::new(Example(0))); Tui::new().unwrap().run(&state)?; Ok(()) } pub struct Example(usize); impl EdnViewData for &Example { fn get_content <'a> (&'a self, sym: &'a str) -> RenderBox<'a, Tui> { Box::new(Thunk::new(move||match sym { ":hello-world" => "Hello world!", ":hello" => "Hello", ":world" => "world", _ => "" })) } } impl Content for Example { fn content (&self) -> impl Render { EdnView::new(self, EDN[self.0]).unwrap() } } impl Handle for Example { fn handle (&mut self, input: &TuiIn) -> Perhaps { match input.event() { kpat!(Right) => self.0 = (self.0 + 1) % EDN.len(), kpat!(Left) => self.0 = if self.0 > 0 { self.0 - 1 } else { EDN.len() - 1 }, _ => return Ok(None) } Ok(Some(true)) } }