Move UTF-8 decoding during streaming to Session

This commit is contained in:
Marcin Kulik
2024-09-21 10:59:22 +02:00
parent cab0490e1e
commit 3855e0dbc8
2 changed files with 14 additions and 16 deletions

View File

@@ -193,27 +193,17 @@ async fn event_loop(
theme: Option<tty::Theme>, theme: Option<tty::Theme>,
) { ) {
let mut session = session::Session::new(tty_size, theme); let mut session = session::Session::new(tty_size, theme);
let mut input_decoder = util::Utf8Decoder::new();
let mut output_decoder = util::Utf8Decoder::new();
loop { loop {
tokio::select! { tokio::select! {
event = events.recv() => { event = events.recv() => {
match event { match event {
Some(Event::Output(time, data)) => { Some(Event::Output(time, data)) => {
let text = output_decoder.feed(&data); session.output(time, &data);
if !text.is_empty() {
session.output(time, text);
}
} }
Some(Event::Input(time, data)) => { Some(Event::Input(time, data)) => {
let text = input_decoder.feed(&data); session.input(time, &data);
if !text.is_empty() {
session.input(time, text);
}
} }
Some(Event::Resize(time, new_tty_size)) => { Some(Event::Resize(time, new_tty_size)) => {

View File

@@ -1,4 +1,5 @@
use crate::tty; use crate::tty;
use crate::util;
use anyhow::Result; use anyhow::Result;
use futures_util::{stream, Stream, StreamExt}; use futures_util::{stream, Stream, StreamExt};
use std::{ use std::{
@@ -14,6 +15,7 @@ pub struct Session {
stream_time: u64, stream_time: u64,
last_event_time: Instant, last_event_time: Instant,
theme: Option<tty::Theme>, theme: Option<tty::Theme>,
output_decoder: util::Utf8Decoder,
} }
#[derive(Clone)] #[derive(Clone)]
@@ -40,17 +42,23 @@ impl Session {
stream_time: 0, stream_time: 0,
last_event_time: Instant::now(), last_event_time: Instant::now(),
theme, theme,
output_decoder: util::Utf8Decoder::new(),
} }
} }
pub fn output(&mut self, time: u64, data: String) { pub fn output(&mut self, time: u64, data: &[u8]) {
self.vt.feed_str(&data); let text = self.output_decoder.feed(data);
let _ = self.broadcast_tx.send(Event::Stdout(time, data));
if !text.is_empty() {
self.vt.feed_str(&text);
let _ = self.broadcast_tx.send(Event::Stdout(time, text));
}
self.stream_time = time; self.stream_time = time;
self.last_event_time = Instant::now(); self.last_event_time = Instant::now();
} }
pub fn input(&mut self, time: u64, _data: String) { pub fn input(&mut self, time: u64, _data: &[u8]) {
self.stream_time = time; self.stream_time = time;
self.last_event_time = Instant::now(); self.last_event_time = Instant::now();
} }