input/
input.rs

1/*
2 * Copyright (c) 2025 Jasmine Tai. All rights reserved.
3 */
4
5use line_ui::element::{Cursor, Direction, Gap, IntoElement};
6use line_ui::{Renderer, Style};
7use termion::event::{Event, Key};
8use termion::input::TermRead;
9use termion::raw::IntoRawMode;
10
11fn main() -> std::io::Result<()> {
12    let stdout = std::io::stdout().into_raw_mode()?;
13    let mut r = Renderer::new(stdout);
14
15    let mut name = String::new();
16
17    let mut events = std::io::stdin().events();
18    loop {
19        r.clear()?;
20        r.render((
21            "Enter your name: ".into_element(),
22            (name.into_element(), Cursor, Gap(1))
23                .fixed_width(20)
24                .truncated(Direction::Left)
25                .with_style(Style::bg(240)),
26        ))?;
27        r.finish()?;
28
29        let Some(event) = events.next().transpose()? else {
30            break;
31        };
32        match event {
33            Event::Key(Key::Char(ch)) if !ch.is_ascii_control() => name.push(ch),
34            Event::Key(Key::Char('\n' | '\r')) => break,
35            Event::Key(Key::Backspace) => {
36                name.pop();
37            }
38            _ => {}
39        }
40    }
41
42    r.clear()?;
43    drop(r);
44    println!("Your name is {name:?}");
45    Ok(())
46}