use std::time::Duration;
use std::time::Instant;
use superconsole::components::Component;
use superconsole::components::DrawMode;
use superconsole::Dimensions;
use superconsole::Line;
use superconsole::Lines;
use superconsole::SuperConsole;
use tokio::select;
use tokio::time;
#[derive(Debug)]
struct Foo {
created: Instant,
now: Instant,
}
impl Component for Foo {
fn draw_unchecked(&self, _dimensions: Dimensions, mode: DrawMode) -> anyhow::Result<Lines> {
Ok(match mode {
DrawMode::Final => Lines::new(),
DrawMode::Normal => {
let elapsed = self.now.duration_since(self.created);
let line1 = vec![elapsed.as_secs().to_string()].try_into().unwrap();
let line2 = vec!["Hello world!".to_owned()].try_into().unwrap();
Lines(vec![line1, line2])
}
})
}
}
fn process_word(word: String) -> Vec<Line> {
let echoed = word.clone();
let reversed: String = word.chars().rev().collect();
let line1 = vec![echoed, reversed].try_into().unwrap();
let line2 = vec!["Some stuff to do with strings".to_owned()]
.try_into()
.unwrap();
vec![line1, line2]
}
async fn task_that_takes_some_time() -> String {
time::sleep(time::Duration::from_secs_f32(0.5)).await;
"hello world".to_owned()
}
#[tokio::main]
async fn main() {
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
let delay = Duration::from_secs(1);
let mut interval = time::interval(delay);
let created = Instant::now();
let mut renderer = SuperConsole::new().unwrap();
loop {
select! {
_ = interval.tick() => {
renderer.render(&Foo {
created,
now: Instant::now(),
}).unwrap();
}
word = task_that_takes_some_time() => {
renderer.emit(Lines(process_word(word)));
}
}
}
}