address_form/
address_form.rs1use std::io;
6
7use crossterm::{
8 event::{self, Event, KeyCode},
9 execute,
10 terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
11};
12use ratatui::{
13 backend::CrosstermBackend,
14 Terminal,
15};
16use ratatui_form::{AddressBlock, Form, FormResult};
17
18fn main() -> io::Result<()> {
19 enable_raw_mode()?;
21 let mut stdout = io::stdout();
22 execute!(stdout, EnterAlternateScreen)?;
23 let backend = CrosstermBackend::new(stdout);
24 let mut terminal = Terminal::new(backend)?;
25
26 let mut form = Form::builder()
28 .title("Shipping Information")
29 .text("name", "Full Name")
30 .placeholder("John Doe")
31 .required()
32 .done()
33 .text("email", "Email")
34 .placeholder("john@example.com")
35 .required()
36 .validator(Box::new(ratatui_form::Email))
37 .done()
38 .text("phone", "Phone")
39 .placeholder("(555) 123-4567")
40 .done()
41 .block(AddressBlock::new("shipping").required())
42 .checkbox("newsletter", "Subscribe to newsletter")
43 .done()
44 .checkbox("terms", "I agree to the terms and conditions")
45 .required()
46 .done()
47 .build();
48
49 loop {
51 terminal.draw(|frame| {
53 let area = frame.area();
54 form.render(area, frame.buffer_mut());
55 })?;
56
57 if let Event::Key(key_event) = event::read()? {
59 if key_event.code == KeyCode::Char('c')
61 && key_event.modifiers.contains(event::KeyModifiers::CONTROL)
62 {
63 break;
64 }
65
66 form.handle_input(key_event);
67
68 match form.result() {
69 FormResult::Submitted => {
70 form.write_json("shipping.json")?;
72 break;
73 }
74 FormResult::Cancelled => {
75 break;
76 }
77 FormResult::Active => {}
78 }
79 }
80 }
81
82 disable_raw_mode()?;
84 execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
85
86 match form.result() {
88 FormResult::Submitted => {
89 println!("Form submitted! Data saved to shipping.json");
90 println!("\nForm data:");
91 println!("{}", serde_json::to_string_pretty(&form.to_json()).unwrap());
92 }
93 FormResult::Cancelled => {
94 println!("Form cancelled.");
95 }
96 FormResult::Active => {
97 println!("Form exited.");
98 }
99 }
100
101 Ok(())
102}