ssh_ui 0.4.1

Painlessly expose Rust TUI applications over ssh
Documentation
use std::{
    error::Error,
    sync::{mpsc::Sender, Arc},
};

use cursive::Cursive;
use russh_keys::key::SignatureHash;
use ssh_ui::{
    cursive::views::{Dialog, TextView},
    russh_keys::key::{KeyPair, PublicKey},
    App, AppServer, AppSession, SessionHandle,
};

struct DialogAppSession {}

impl DialogAppSession {
    pub fn new() -> Self {
        Self {}
    }
}

impl AppSession for DialogAppSession {
    fn on_start(
        &mut self,
        _siv: &mut Cursive,
        _session_handle: SessionHandle,
        _pub_key: Option<PublicKey>,
        _force_refresh_sender: Sender<()>,
    ) -> Result<Box<dyn cursive::View>, Box<dyn Error>> {
        println!("on_start");
        Ok(Box::new(
            Dialog::around(TextView::new("Hello over ssh!"))
                .title("ssh_ui")
                .button("Quit", |s| s.quit()),
        ))
    }
}

struct DialogApp {}

impl App for DialogApp {
    fn on_load(&mut self) -> Result<(), Box<dyn Error>> {
        println!("load");
        Ok(())
    }

    fn new_session(&self) -> Box<dyn AppSession> {
        println!("new session");
        Box::new(DialogAppSession::new())
    }
}

#[tokio::main]
async fn main() {
    let key_pairs = [
        KeyPair::generate_rsa(4096, SignatureHash::SHA2_256).unwrap(),
        KeyPair::generate_ed25519().unwrap(),
    ];
    let mut server = AppServer::new_with_port(2222);
    let app = DialogApp {};
    server.run(&key_pairs, Arc::new(app)).await.unwrap();
}