use clap::Parser;
mod agent;
mod config;
mod hint;
mod input;
mod pointer;
mod render;
#[derive(Parser, Debug)]
#[command(name = "waywarp", version, about)]
struct Args {
#[arg(long)]
list_hints: bool,
#[arg(long, value_enum, default_value = "text")]
format: OutputFormat,
#[arg(long)]
select: Option<String>,
#[arg(long, num_args = 2)]
move_to: Option<Vec<i32>>,
#[arg(long, num_args = 2)]
move_by: Option<Vec<i32>>,
#[arg(long, value_enum, default_value = "left")]
click: ClickType,
#[arg(long)]
print_coords: bool,
#[arg(long)]
oneshot: bool,
#[arg(long)]
normal: bool,
}
#[derive(clap::ValueEnum, Clone, Debug)]
enum OutputFormat {
Text,
Json,
}
#[derive(clap::ValueEnum, Clone, Debug)]
enum ClickType {
Left,
Right,
Middle,
}
fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
let _config = config::Config::load();
let args = Args::parse();
if args.list_hints {
agent::AgentMode::list_hints(&_config)?;
return Ok(());
}
if let Some(label) = &args.select {
agent::AgentMode::select_hint(label, &_config)?;
return Ok(());
}
if let Some(coords) = &args.move_to {
let mouse_btn = match args.click {
ClickType::Left => pointer::MouseButton::Left,
ClickType::Right => pointer::MouseButton::Right,
ClickType::Middle => pointer::MouseButton::Middle,
};
agent::AgentMode::move_to(coords[0], coords[1], Some(mouse_btn), &_config)?;
return Ok(());
}
if let Some(offsets) = &args.move_by {
let mouse_btn = match args.click {
ClickType::Left => pointer::MouseButton::Left,
ClickType::Right => pointer::MouseButton::Right,
ClickType::Middle => pointer::MouseButton::Middle,
};
agent::AgentMode::move_by(offsets[0], offsets[1], Some(mouse_btn), &_config)?;
return Ok(());
}
let config = config::Config::load();
let grid = hint::HintGrid::new(0, 0, 0);
let mut renderer = render::Renderer::new()?;
if args.normal {
renderer.state.borrow_mut().mode = render::InteractionMode::Normal;
}
renderer.draw_overlay(&grid, &config)?;
Ok(())
}