use std::{error::Error, fs::read_to_string, io};
use clap::{Arg, Command};
use crossterm::{
event::{DisableMouseCapture, EnableMouseCapture},
execute,
terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode},
};
use ratatui::{Terminal, backend::CrosstermBackend};
mod app;
mod config;
mod ui;
use app::App;
use config::Config;
fn main() -> Result<(), Box<dyn Error>> {
let matches = Command::new("longtime")
.version("1.0")
.about("Multi-timezone Time Manager")
.arg(
Arg::new("config")
.short('c')
.long("config")
.value_name("FILE")
.help("Sets a custom config file path")
.default_value("timezones.toml"),
)
.get_matches();
let config_path = matches
.get_one::<String>("config")
.expect("Config argument should be present as it has a default value");
let config_content = match read_to_string(config_path) {
Ok(content) => content,
Err(e) => {
println!("Error: Unable to read config file '{config_path}': {e}");
return Err(Box::new(e));
}
};
let config: Config = match toml::from_str(&config_content) {
Ok(config) => config,
Err(e) => {
println!("Error: Failed to parse TOML config file: {e}");
println!("Config file content:\n{config_content}");
return Err(Box::new(e));
}
};
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
let app = App::new(config);
let res = ui::run_app(&mut terminal, app);
disable_raw_mode()?;
execute!(
terminal.backend_mut(),
LeaveAlternateScreen,
DisableMouseCapture
)?;
terminal.show_cursor()?;
if let Err(err) = res {
println!("{err:?}");
}
Ok(())
}