Tui

Struct Tui 

Source
pub struct Tui { /* private fields */ }
Expand description

Main TUI handle that integrates with the event bus.

Implementations§

Source§

impl Tui

Source

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}
Source

pub fn with_prefix( self, prefix_key: KeyCode, prefix_modifiers: KeyModifiers, ) -> Self

Sets custom prefix key.

Source

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}
Source

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().

Source

pub fn observer(&self) -> impl Fn(&Event) + Send + 'static

Returns an observer closure that updates TUI state from events.

Source

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§

Source§

impl Default for Tui

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

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>

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)

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)

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
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more