Files
asciinema/src/encoder/txt.rs

83 lines
1.9 KiB
Rust
Raw Normal View History

2024-11-12 13:46:38 +01:00
use crate::asciicast::{Event, EventData, Header};
use avt::util::TextCollector;
2024-01-25 16:01:14 +01:00
pub struct TextEncoder {
collector: Option<TextCollector>,
2024-01-25 16:01:14 +01:00
}
impl TextEncoder {
pub fn new() -> Self {
TextEncoder { collector: None }
2024-01-25 16:01:14 +01:00
}
}
impl super::Encoder for TextEncoder {
2024-11-12 13:46:38 +01:00
fn header(&mut self, header: &Header) -> Vec<u8> {
2024-01-25 16:01:14 +01:00
let vt = avt::Vt::builder()
2024-11-12 13:46:38 +01:00
.size(header.cols as usize, header.rows as usize)
.scrollback_limit(100)
2024-01-25 16:01:14 +01:00
.build();
self.collector = Some(TextCollector::new(vt));
2024-01-25 16:01:14 +01:00
Vec::new()
2024-01-25 16:01:14 +01:00
}
fn event(&mut self, event: Event) -> Vec<u8> {
use EventData::*;
2024-01-25 16:01:14 +01:00
match &event.data {
Output(data) => text_lines_to_bytes(self.collector.as_mut().unwrap().feed_str(data)),
Resize(cols, rows) => {
text_lines_to_bytes(self.collector.as_mut().unwrap().resize(*cols, *rows))
}
_ => Vec::new(),
2024-01-25 16:01:14 +01:00
}
}
2024-11-12 13:46:38 +01:00
fn flush(&mut self) -> Vec<u8> {
text_lines_to_bytes(self.collector.take().unwrap().flush().iter())
}
}
2024-01-25 16:01:14 +01:00
fn text_lines_to_bytes<S: AsRef<str>>(lines: impl Iterator<Item = S>) -> Vec<u8> {
lines.fold(Vec::new(), |mut bytes, line| {
bytes.extend_from_slice(line.as_ref().as_bytes());
bytes.push(b'\n');
2024-01-25 16:01:14 +01:00
bytes
})
2024-01-25 16:01:14 +01:00
}
#[cfg(test)]
2024-01-28 20:11:47 +01:00
mod tests {
use super::TextEncoder;
2024-11-12 13:46:38 +01:00
use crate::asciicast::{Event, Header};
2024-01-25 16:01:14 +01:00
use crate::encoder::Encoder;
#[test]
fn encoder() {
let mut enc = TextEncoder::new();
2024-11-12 13:46:38 +01:00
let header = Header {
cols: 3,
rows: 1,
..Default::default()
};
assert!(enc.header(&header).is_empty());
2024-01-25 16:01:14 +01:00
assert!(enc
.event(Event::output(0, "he\x1b[1mllo\r\n".to_owned()))
.is_empty());
2024-01-25 16:01:14 +01:00
assert!(enc
.event(Event::output(1, "world\r\n".to_owned()))
.is_empty());
2024-11-12 13:46:38 +01:00
assert_eq!(enc.flush(), "hello\nworld\n".as_bytes());
2024-01-25 16:01:14 +01:00
}
}