Initial commit
This commit is contained in:
82
src/main.rs
Normal file
82
src/main.rs
Normal file
@@ -0,0 +1,82 @@
|
||||
mod app;
|
||||
mod config;
|
||||
mod error;
|
||||
mod executor;
|
||||
mod menu;
|
||||
mod network;
|
||||
mod ui;
|
||||
|
||||
use std::io;
|
||||
use anyhow::Result;
|
||||
use crossterm::{
|
||||
event::{DisableMouseCapture, EnableMouseCapture},
|
||||
execute,
|
||||
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
||||
};
|
||||
use ratatui::{backend::CrosstermBackend, Terminal};
|
||||
use tokio::sync::mpsc;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
let config = config::Config::load()?;
|
||||
|
||||
enable_raw_mode()?;
|
||||
let mut stdout = io::stdout();
|
||||
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
|
||||
let backend = CrosstermBackend::new(stdout);
|
||||
let mut terminal = Terminal::new(backend)?;
|
||||
|
||||
let (event_tx, mut event_rx) = mpsc::unbounded_channel();
|
||||
let mut app = app::App::new(config, event_tx.clone());
|
||||
app.load_menu().await;
|
||||
|
||||
let res = run_app(&mut terminal, &mut app, &mut event_rx).await;
|
||||
|
||||
disable_raw_mode()?;
|
||||
execute!(
|
||||
terminal.backend_mut(),
|
||||
LeaveAlternateScreen,
|
||||
DisableMouseCapture
|
||||
)?;
|
||||
terminal.show_cursor()?;
|
||||
|
||||
if let Err(err) = res {
|
||||
println!("Ошибка: {:?}", err);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn run_app(
|
||||
terminal: &mut Terminal<CrosstermBackend<io::Stdout>>,
|
||||
app: &mut app::App,
|
||||
event_rx: &mut mpsc::UnboundedReceiver<app::Event>,
|
||||
) -> Result<()> {
|
||||
loop {
|
||||
terminal.draw(|f| ui::render(f, app))?;
|
||||
|
||||
let event = tokio::select! {
|
||||
crossterm_event = read_crossterm_event() => {
|
||||
match crossterm_event {
|
||||
Ok(Some(evt)) => app::Event::Crossterm(evt),
|
||||
Ok(None) => continue,
|
||||
Err(e) => app::Event::Error(e.to_string()),
|
||||
}
|
||||
}
|
||||
Some(evt) = event_rx.recv() => evt,
|
||||
};
|
||||
|
||||
if app.handle_event(event).await? {
|
||||
break;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn read_crossterm_event() -> Result<Option<crossterm::event::Event>> {
|
||||
if crossterm::event::poll(std::time::Duration::from_millis(100))? {
|
||||
Ok(Some(crossterm::event::read()?))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user