pub struct Tui { /* private fields */ }Expand description
Main TUI handle that integrates with the event bus.
Implementations§
Source§impl Tui
impl Tui
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new TUI instance with shared state.
Examples found in repository?
examples/pty_output_demo.rs (line 66)
13async fn main() -> anyhow::Result<()> {
14 // Spawn ls -la command
15 let mut child = Command::new("ls")
16 .arg("-la")
17 .stdout(Stdio::piped())
18 .stderr(Stdio::piped())
19 .spawn()?;
20
21 let stdout = child.stdout.take().expect("Failed to capture stdout");
22 let stderr = child.stderr.take().expect("Failed to capture stderr");
23
24 // Create channels for PTY handle
25 let (output_tx, output_rx) = mpsc::unbounded_channel();
26 let (input_tx, _input_rx) = mpsc::unbounded_channel();
27 let (control_tx, _control_rx) = mpsc::unbounded_channel();
28 let (_terminated_tx, terminated_rx) = watch::channel(false);
29
30 // Clone output_tx before moving it
31 let output_tx_clone = output_tx.clone();
32
33 // Spawn task to read stdout and send to output channel
34 tokio::spawn(async move {
35 let mut stdout = stdout;
36 let mut buf = vec![0u8; 1024];
37 while let Ok(n) = stdout.read(&mut buf).await {
38 if n == 0 {
39 break;
40 }
41 let _ = output_tx.send(buf[..n].to_vec());
42 }
43 });
44
45 // Spawn task to read stderr and send to output channel
46 tokio::spawn(async move {
47 let mut stderr = stderr;
48 let mut buf = vec![0u8; 1024];
49 while let Ok(n) = stderr.read(&mut buf).await {
50 if n == 0 {
51 break;
52 }
53 let _ = output_tx_clone.send(buf[..n].to_vec());
54 }
55 });
56
57 // Create PTY handle
58 let pty_handle = PtyHandle {
59 output_rx,
60 input_tx,
61 control_tx,
62 terminated_rx,
63 };
64
65 // Create TUI with PTY handle
66 let tui = Tui::new().with_pty(pty_handle);
67
68 // Run TUI (will exit on Ctrl+C)
69 tui.run().await?;
70
71 // Wait for command to finish
72 let _ = child.wait().await;
73
74 Ok(())
75}Sourcepub fn with_prefix(
self,
prefix_key: KeyCode,
prefix_modifiers: KeyModifiers,
) -> Self
pub fn with_prefix( self, prefix_key: KeyCode, prefix_modifiers: KeyModifiers, ) -> Self
Sets custom prefix key.
Sourcepub fn with_pty(self, pty_handle: PtyHandle) -> Self
pub fn with_pty(self, pty_handle: PtyHandle) -> Self
Sets the PTY handle for terminal output.
Examples found in repository?
examples/pty_output_demo.rs (line 66)
13async fn main() -> anyhow::Result<()> {
14 // Spawn ls -la command
15 let mut child = Command::new("ls")
16 .arg("-la")
17 .stdout(Stdio::piped())
18 .stderr(Stdio::piped())
19 .spawn()?;
20
21 let stdout = child.stdout.take().expect("Failed to capture stdout");
22 let stderr = child.stderr.take().expect("Failed to capture stderr");
23
24 // Create channels for PTY handle
25 let (output_tx, output_rx) = mpsc::unbounded_channel();
26 let (input_tx, _input_rx) = mpsc::unbounded_channel();
27 let (control_tx, _control_rx) = mpsc::unbounded_channel();
28 let (_terminated_tx, terminated_rx) = watch::channel(false);
29
30 // Clone output_tx before moving it
31 let output_tx_clone = output_tx.clone();
32
33 // Spawn task to read stdout and send to output channel
34 tokio::spawn(async move {
35 let mut stdout = stdout;
36 let mut buf = vec![0u8; 1024];
37 while let Ok(n) = stdout.read(&mut buf).await {
38 if n == 0 {
39 break;
40 }
41 let _ = output_tx.send(buf[..n].to_vec());
42 }
43 });
44
45 // Spawn task to read stderr and send to output channel
46 tokio::spawn(async move {
47 let mut stderr = stderr;
48 let mut buf = vec![0u8; 1024];
49 while let Ok(n) = stderr.read(&mut buf).await {
50 if n == 0 {
51 break;
52 }
53 let _ = output_tx_clone.send(buf[..n].to_vec());
54 }
55 });
56
57 // Create PTY handle
58 let pty_handle = PtyHandle {
59 output_rx,
60 input_tx,
61 control_tx,
62 terminated_rx,
63 };
64
65 // Create TUI with PTY handle
66 let tui = Tui::new().with_pty(pty_handle);
67
68 // Run TUI (will exit on Ctrl+C)
69 tui.run().await?;
70
71 // Wait for command to finish
72 let _ = child.wait().await;
73
74 Ok(())
75}Sourcepub fn with_hat_map(self, hat_map: HashMap<String, (HatId, String)>) -> Self
pub fn with_hat_map(self, hat_map: HashMap<String, (HatId, String)>) -> Self
Sets the hat map for dynamic topic-to-hat resolution.
This allows the TUI to display the correct hat for custom topics without hardcoding them in TuiState::update().
Sourcepub fn observer(&self) -> impl Fn(&Event) + Send + 'static
pub fn observer(&self) -> impl Fn(&Event) + Send + 'static
Returns an observer closure that updates TUI state from events.
Sourcepub async fn run(self) -> Result<()>
pub async fn run(self) -> Result<()>
Runs the TUI application loop.
§Panics
Panics if with_pty() was not called before running.
§Errors
Returns an error if the terminal cannot be initialized or if the application loop encounters an unrecoverable error.
Examples found in repository?
examples/pty_output_demo.rs (line 69)
13async fn main() -> anyhow::Result<()> {
14 // Spawn ls -la command
15 let mut child = Command::new("ls")
16 .arg("-la")
17 .stdout(Stdio::piped())
18 .stderr(Stdio::piped())
19 .spawn()?;
20
21 let stdout = child.stdout.take().expect("Failed to capture stdout");
22 let stderr = child.stderr.take().expect("Failed to capture stderr");
23
24 // Create channels for PTY handle
25 let (output_tx, output_rx) = mpsc::unbounded_channel();
26 let (input_tx, _input_rx) = mpsc::unbounded_channel();
27 let (control_tx, _control_rx) = mpsc::unbounded_channel();
28 let (_terminated_tx, terminated_rx) = watch::channel(false);
29
30 // Clone output_tx before moving it
31 let output_tx_clone = output_tx.clone();
32
33 // Spawn task to read stdout and send to output channel
34 tokio::spawn(async move {
35 let mut stdout = stdout;
36 let mut buf = vec![0u8; 1024];
37 while let Ok(n) = stdout.read(&mut buf).await {
38 if n == 0 {
39 break;
40 }
41 let _ = output_tx.send(buf[..n].to_vec());
42 }
43 });
44
45 // Spawn task to read stderr and send to output channel
46 tokio::spawn(async move {
47 let mut stderr = stderr;
48 let mut buf = vec![0u8; 1024];
49 while let Ok(n) = stderr.read(&mut buf).await {
50 if n == 0 {
51 break;
52 }
53 let _ = output_tx_clone.send(buf[..n].to_vec());
54 }
55 });
56
57 // Create PTY handle
58 let pty_handle = PtyHandle {
59 output_rx,
60 input_tx,
61 control_tx,
62 terminated_rx,
63 };
64
65 // Create TUI with PTY handle
66 let tui = Tui::new().with_pty(pty_handle);
67
68 // Run TUI (will exit on Ctrl+C)
69 tui.run().await?;
70
71 // Wait for command to finish
72 let _ = child.wait().await;
73
74 Ok(())
75}Trait Implementations§
Auto Trait Implementations§
impl Freeze for Tui
impl !RefUnwindSafe for Tui
impl Send for Tui
impl Sync for Tui
impl Unpin for Tui
impl !UnwindSafe for Tui
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more