use crate::mouse::mouse_input;
use crate::script_engine::instruction::{
InstructionData, InstructionHandler, InstructionMetadata, ScriptError,
};
use crate::script_engine::VMContext;
use windows::Win32::UI::Input::KeyboardAndMouse::INPUT;
#[derive(Clone)]
pub struct MoveRelParams {
pub move_input: INPUT,
}
pub struct MoveRelHandler;
impl InstructionHandler for MoveRelHandler {
fn name(&self) -> &str {
"moverel"
}
#[inline]
fn parse(&self, args: &[&str]) -> Result<InstructionData, ScriptError> {
if args.len() != 2 {
return Err(ScriptError::ParseError(
"Missing offsets. Usage: moverel <dx> <dy>".into(),
));
}
let dx = args[0].parse::<i32>().map_err(|e| {
ScriptError::ParseError(format!("Invalid dx offset '{}': {}", args[0], e))
})?;
let dy = args[1].parse::<i32>().map_err(|e| {
ScriptError::ParseError(format!("Invalid dy offset '{}': {}", args[1], e))
})?;
Ok(InstructionData::Custom(Box::new(MoveRelParams {
move_input: mouse_input::build_move_relative(dx, dy),
})))
}
#[inline]
fn execute(
&self,
_vm: &mut VMContext,
data: &InstructionData,
_metadata: Option<&InstructionMetadata>,
) -> Result<(), ScriptError> {
let params = data.extract_custom::<MoveRelParams>("Invalid moverel parameters")?;
mouse_input::execute_single_input(¶ms.move_input).map_err(|e| {
ScriptError::ExecutionError(format!("Move relative failed: {:?}", e))
})?;
Ok(())
}
}