use clap::Parser;
use sd_300::{
app::App,
cli::{Cli, Command},
error::Result,
types::DiagnosticMode,
};
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
#[cfg(windows)]
{
enable_utf8_console();
}
if cli.update || cli.command == Some(Command::Update) {
let exit_code = sd_300::update::run()?;
std::process::exit(exit_code);
}
let initial_mode = if cli.user {
Some(DiagnosticMode::User)
} else if cli.tech {
Some(DiagnosticMode::Technician)
} else {
None
};
let original_hook = std::panic::take_hook();
std::panic::set_hook(Box::new(move |panic_info| {
ratatui::restore();
original_hook(panic_info);
}));
let mut terminal = ratatui::init();
let mut app = App::new(initial_mode);
let result = app.run(&mut terminal).await;
ratatui::restore();
result
}
#[cfg(windows)]
fn enable_utf8_console() {
use std::io::IsTerminal;
if std::io::stdout().is_terminal() {
unsafe {
winapi::um::wincon::SetConsoleOutputCP(65001);
}
}
}