use autoitx::{Keys, keys};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let from_the_database = "Ünïcödé {not a token} 50%+VAT!";
let safe = Keys::text(from_the_database);
println!("text() {:?}", safe.as_str());
println!(
" -> {} tokens, all literal characters",
safe.tokens()?.len()
);
let shortcut = keys!("{CTRLDOWN}c{CTRLUP}");
println!("\nkeys!() {:?}", shortcut.as_str());
match Keys::parse("{TAB}{TAB}{ENTER}") {
Ok(k) => println!("\nparse() {:?} ok", k.as_str()),
Err(e) => println!("\nparse() rejected: {e}"),
}
if let Err(e) = Keys::parse("{NOSUCHKEY}") {
println!("parse() rejected {{NOSUCHKEY}}: {e}");
}
let raw = Keys::raw_unchecked("{F5}");
println!(
"\nraw_unchecked() {:?} — no validation at all",
raw.as_str()
);
println!("\nThe rule: data goes through text(), sequences you wrote go");
println!("through keys!(). If you find yourself with format!() and a send");
println!("string, that is the injection bug.");
Ok(())
}