79 lines
2.0 KiB
Rust
79 lines
2.0 KiB
Rust
//! Parse input from stdin and log actions on stdout
|
|
use std::io::{self, Read};
|
|
|
|
use anstyle_parse::{DefaultCharAccumulator, Params, Parser, Perform};
|
|
|
|
/// A type implementing Perform that just logs actions
|
|
struct Log;
|
|
|
|
impl Perform for Log {
|
|
fn print(&mut self, c: char) {
|
|
println!("[print] {:?}", c);
|
|
}
|
|
|
|
fn execute(&mut self, byte: u8) {
|
|
println!("[execute] {:02x}", byte);
|
|
}
|
|
|
|
fn hook(&mut self, params: &Params, intermediates: &[u8], ignore: bool, c: u8) {
|
|
println!(
|
|
"[hook] params={:?}, intermediates={:?}, ignore={:?}, char={:?}",
|
|
params, intermediates, ignore, c
|
|
);
|
|
}
|
|
|
|
fn put(&mut self, byte: u8) {
|
|
println!("[put] {:02x}", byte);
|
|
}
|
|
|
|
fn unhook(&mut self) {
|
|
println!("[unhook]");
|
|
}
|
|
|
|
fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) {
|
|
println!(
|
|
"[osc_dispatch] params={:?} bell_terminated={}",
|
|
params, bell_terminated
|
|
);
|
|
}
|
|
|
|
fn csi_dispatch(&mut self, params: &Params, intermediates: &[u8], ignore: bool, c: u8) {
|
|
println!(
|
|
"[csi_dispatch] params={:#?}, intermediates={:?}, ignore={:?}, char={:?}",
|
|
params, intermediates, ignore, c
|
|
);
|
|
}
|
|
|
|
fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) {
|
|
println!(
|
|
"[esc_dispatch] intermediates={:?}, ignore={:?}, byte={:02x}",
|
|
intermediates, ignore, byte
|
|
);
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let input = io::stdin();
|
|
let mut handle = input.lock();
|
|
|
|
let mut statemachine = Parser::<DefaultCharAccumulator>::new();
|
|
let mut performer = Log;
|
|
|
|
let mut buf = [0; 2048];
|
|
|
|
loop {
|
|
match handle.read(&mut buf) {
|
|
Ok(0) => break,
|
|
Ok(n) => {
|
|
for byte in &buf[..n] {
|
|
statemachine.advance(&mut performer, *byte);
|
|
}
|
|
}
|
|
Err(err) => {
|
|
println!("err: {}", err);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|