()
| 1540 | } |
| 1541 | |
| 1542 | fn run_experimental_tui_intro() -> Result<ExperimentalTuiIntroOutcome> { |
| 1543 | use crossterm::{ |
| 1544 | event::{self, Event, KeyCode}, |
| 1545 | execute, |
| 1546 | terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}, |
| 1547 | }; |
| 1548 | use ratatui::{Terminal, backend::CrosstermBackend}; |
| 1549 | |
| 1550 | struct TerminalGuard; |
| 1551 | |
| 1552 | impl Drop for TerminalGuard { |
| 1553 | fn drop(&mut self) { |
| 1554 | let _ = disable_raw_mode(); |
| 1555 | let _ = execute!(io::stdout(), LeaveAlternateScreen); |
| 1556 | } |
| 1557 | } |
| 1558 | |
| 1559 | enable_raw_mode()?; |
| 1560 | let _guard = TerminalGuard; |
| 1561 | execute!(io::stdout(), EnterAlternateScreen)?; |
| 1562 | |
| 1563 | let backend = CrosstermBackend::new(io::stdout()); |
| 1564 | let mut terminal = Terminal::new(backend)?; |
| 1565 | terminal.clear()?; |
| 1566 | |
| 1567 | loop { |
| 1568 | terminal.draw(render_experimental_tui_intro_frame)?; |
| 1569 | |
| 1570 | if let Event::Key(key) = event::read()? { |
| 1571 | match key.code { |
| 1572 | KeyCode::Enter => return Ok(ExperimentalTuiIntroOutcome::Continue), |
| 1573 | KeyCode::Esc | KeyCode::Char('q') => { |
| 1574 | return Ok(ExperimentalTuiIntroOutcome::Cancelled); |
| 1575 | } |
| 1576 | _ => {} |
| 1577 | } |
| 1578 | } |
| 1579 | } |
| 1580 | } |
| 1581 | |
| 1582 | /// Interactive wizard for initializing agentsync with file migration |
| 1583 | pub fn init_wizard(project_root: &Path, force: bool) -> Result<()> { |
no outgoing calls
no test coverage detected