Skip to main content

romm_cli/tui/screens/setup_wizard/
run.rs

1//! Standalone first-run setup event loop.
2
3use 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}