aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-12-06 03:33:57 -0500
committerJesse Luehrs <doy@tozt.net>2021-12-06 03:34:35 -0500
commitd94ec144dd1ca29886ebbc438882e73af6fe0ae9 (patch)
tree4b512bcb9dced2fb0a03974cedd0cc9baed05641
parent37f25e563499399c7645bcffb6f4e47bba749514 (diff)
downloadvt100-rust-d94ec144dd1ca29886ebbc438882e73af6fe0ae9.tar.gz
vt100-rust-d94ec144dd1ca29886ebbc438882e73af6fe0ae9.zip
add example for testing vte processing
-rw-r--r--Cargo.toml1
-rw-r--r--examples/vte.rs85
2 files changed, 86 insertions, 0 deletions
diff --git a/Cargo.toml b/Cargo.toml
index ff8c6ad..922ebed 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -25,3 +25,4 @@ rand = "0.7"
serde = { version = "1.0.130", features = ["derive"] }
serde_json = "1.0.69"
terminal_size = "0.1.17"
+vte = "0.10.1"
diff --git a/examples/vte.rs b/examples/vte.rs
new file mode 100644
index 0000000..e7db674
--- /dev/null
+++ b/examples/vte.rs
@@ -0,0 +1,85 @@
+use std::io::Read as _;
+
+/// A type implementing Perform that just logs actions
+struct Log;
+
+impl vte::Perform for Log {
+ fn print(&mut self, c: char) {
+ println!("[print] U+{:04x}", c as u32);
+ }
+
+ fn execute(&mut self, byte: u8) {
+ println!("[execute] {:02x}", byte);
+ }
+
+ fn hook(
+ &mut self,
+ params: &vte::Params,
+ intermediates: &[u8],
+ ignore: bool,
+ c: char,
+ ) {
+ println!(
+ "[hook] params={:?}, intermediates={:?}, ignore={:?}, c=U+{:04x}",
+ params, intermediates, ignore, c as u32
+ );
+ }
+
+ 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: &vte::Params,
+ intermediates: &[u8],
+ ignore: bool,
+ c: char,
+ ) {
+ println!(
+ "[csi_dispatch] \
+ params={:#?}, intermediates={:?}, ignore={:?}, c=U+{:04x}",
+ params, intermediates, ignore, c as u32
+ );
+ }
+
+ fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) {
+ println!(
+ "[esc_dispatch] intermediates={:?}, ignore={:?}, byte={:02x}",
+ intermediates, ignore, byte
+ );
+ }
+}
+
+fn main() {
+ let mut stdin = std::io::stdin();
+ let mut parser = vte::Parser::new();
+ let mut performer = Log;
+
+ let mut buf = [0; 4096];
+ loop {
+ match stdin.read(&mut buf) {
+ Ok(0) => break,
+ Ok(n) => {
+ for byte in &buf[..n] {
+ parser.advance(&mut performer, *byte);
+ }
+ }
+ Err(err) => {
+ eprintln!("err: {}", err);
+ std::process::exit(1);
+ }
+ }
+ }
+}