use clap::Parser;
use crossterm::{
event::{DisableMouseCapture, EnableMouseCapture},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{backend::CrosstermBackend, Terminal};
use std::io;
mod browser;
mod network;
mod renderer;
use browser::{ui, BrowserApp, SearchEngine};
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
url: Option<String>,
#[arg(long, group = "search_engine")]
google: bool,
#[arg(long, group = "search_engine")]
duckduck: bool,
#[arg(long, group = "search_engine")]
bing: bool,
#[arg(long, group = "search_engine")]
brave: bool,
#[arg(long, group = "search_engine")]
swisscows: bool,
#[arg(long, group = "search_engine")]
qwant: bool,
#[arg(long)]
static_homepage: bool,
}
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let args = Args::parse();
let engine = if args.google {
SearchEngine::Google
} else if args.bing {
SearchEngine::Bing
} else if args.brave {
SearchEngine::Brave
} else if args.swisscows {
SearchEngine::Swisscows
} else if args.qwant {
SearchEngine::Qwant
} else {
SearchEngine::DuckDuckGo
};
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
let mut app = BrowserApp::new(engine);
app.load_bookmarks();
app.load_initial_url(args.url, args.static_homepage).await;
loop {
terminal.draw(|f| ui(f, &app))?;
let should_quit = app
.run_step(terminal.size()?.width, terminal.size()?.height)
.await?;
if should_quit {
break;
}
}
disable_raw_mode()?;
execute!(
terminal.backend_mut(),
LeaveAlternateScreen,
DisableMouseCapture
)?;
terminal.show_cursor()?;
Ok(())
}