use std::io;
use crossterm::{
event::{self, Event, KeyCode},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{
backend::CrosstermBackend,
Terminal,
};
use ratatui_form::{AddressBlock, Form, FormResult};
fn main() -> io::Result<()> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
let mut form = Form::builder()
.title("Shipping Information")
.text("name", "Full Name")
.placeholder("John Doe")
.required()
.done()
.text("email", "Email")
.placeholder("john@example.com")
.required()
.validator(Box::new(ratatui_form::Email))
.done()
.text("phone", "Phone")
.placeholder("(555) 123-4567")
.done()
.block(AddressBlock::new("shipping").required())
.checkbox("newsletter", "Subscribe to newsletter")
.done()
.checkbox("terms", "I agree to the terms and conditions")
.required()
.done()
.build();
loop {
terminal.draw(|frame| {
let area = frame.area();
form.render(area, frame.buffer_mut());
})?;
if let Event::Key(key_event) = event::read()? {
if key_event.code == KeyCode::Char('c')
&& key_event.modifiers.contains(event::KeyModifiers::CONTROL)
{
break;
}
form.handle_input(key_event);
match form.result() {
FormResult::Submitted => {
form.write_json("shipping.json")?;
break;
}
FormResult::Cancelled => {
break;
}
FormResult::Active => {}
}
}
}
disable_raw_mode()?;
execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
match form.result() {
FormResult::Submitted => {
println!("Form submitted! Data saved to shipping.json");
println!("\nForm data:");
println!("{}", serde_json::to_string_pretty(&form.to_json()).unwrap());
}
FormResult::Cancelled => {
println!("Form cancelled.");
}
FormResult::Active => {
println!("Form exited.");
}
}
Ok(())
}