use handle_this::{handle, Result};
use std::io;
fn io_err(msg: &str) -> io::Error {
io::Error::new(io::ErrorKind::Other, msg)
}
fn main() {
println!("=== Test 1: Guard matches ===");
let result: Result<i32> = handle! {
try {
Err(io_err("error code 42"))?
}
catch io::Error(e) when e.to_string().contains("42") {
println!("Caught with guard: {}", e);
100
}
};
println!("Result: {:?}\n", result);
println!("=== Test 2: Type matches, guard FAILS ===");
let result: Result<i32> = handle! {
try {
Err(io_err("error code 99"))? }
catch io::Error(e) when e.to_string().contains("42") {
println!("Caught with guard: {}", e);
100
}
};
println!("Result: {:?}\n", result);
println!("=== Test 3: Guard fails, catch-all handles ===");
let result: Result<i32> = handle! {
try {
Err(io_err("error code 99"))?
}
catch io::Error(e) when e.to_string().contains("42") {
println!("Caught io::Error with 42");
100
}
catch e {
println!("Catch-all got: {}", e);
200
}
};
println!("Result: {:?}\n", result);
println!("=== Test 4: Control flow + guard (signal mode) ===");
for i in 0..3 {
print!("i={}: ", i);
let result: Result<i32> = handle! {
try {
if i == 1 {
Err(io_err("error code 42"))? } else if i == 2 {
Err(io_err("error code 99"))? }
i * 10
}
catch io::Error(error) when error.to_string().contains("42") {
println!("guard matched, breaking");
break;
}
catch { 0 } };
println!("result = {:?}", result);
}
println!("\n=== Test 5: Explicit direct mode (try -> T) ===");
let val = handle! {
try -> i32 {
Err(io_err("explicit direct"))?
}
catch io::Error(e) {
println!("Caught in explicit direct mode: {}", e);
42
}
catch { unreachable!() } };
println!("val = {}", val);
println!("\n=== Test 6: Explicit direct mode with else ===");
let val = handle! {
try -> i32 {
Err(io_err("will hit else"))?
}
else {
println!("else block executed");
-1
}
};
println!("val = {}", val);
}