romm_cli/tui/screens/setup_wizard/
run.rs1use anyhow::{anyhow, Result};
4use crossterm::event::{self, Event};
5
6use crate::config::{default_theme_id, Config};
7use crate::tui::runtime::{RuntimeOptions, TuiSession};
8use crate::tui::theme::{resolve_theme_or_default, RommStyles};
9
10use super::event::{map_setup_event, SetupEvent};
11use super::types::SetupWizard;
12
13impl SetupWizard {
14 pub async fn run(mut self, verbose: bool) -> Result<Config> {
15 let mut session = TuiSession::enter(RuntimeOptions {
16 bracketed_paste: true,
17 })?;
18 let theme = resolve_theme_or_default(&default_theme_id());
19
20 loop {
21 let styles = RommStyles::new(theme.as_ref());
22 session.terminal_mut().draw(|f| {
23 let area = f.area();
24 self.render(f, area, &styles);
25 if let Some((x, y)) = self.cursor_pos(area) {
26 f.set_cursor_position((x, y));
27 }
28 })?;
29
30 if event::poll(std::time::Duration::from_millis(100))? {
31 let setup_event = match event::read()? {
32 Event::Key(key) => SetupEvent::Key(key),
33 Event::Paste(text) => SetupEvent::Paste(text),
34 _ => continue,
35 };
36 let action = map_setup_event(setup_event);
37 if self.update(action)? {
38 session.leave()?;
39 return Err(anyhow!("setup cancelled"));
40 }
41
42 if self.testing {
43 let styles = RommStyles::new(theme.as_ref());
44 session.terminal_mut().draw(|f| {
45 let area = f.area();
46 self.render(f, area, &styles);
47 })?;
48 let result = self.try_connect_and_persist(verbose).await;
49 self.testing = false;
50 match result {
51 Ok(cfg) => {
52 session.leave()?;
53 return Ok(cfg);
54 }
55 Err(e) => {
56 self.error = Some(format!("{e:#}"));
57 }
58 }
59 }
60 }
61 }
62 }
63}