stablessh 0.1.5

Keeps SSH on even when laptop is closed
use crate::proto_impl;
use anyhow::Result;
use clap::{Parser, Subcommand};

#[derive(Parser, Debug, Clone)]
#[clap(name = "ctl")]
pub struct Opt {
    #[command(subcommand)]
    target: Targets,

    #[clap(long = "ctl-target", default_value = "http://[::1]:50051")]
    ctl_target: String,
}

#[derive(Subcommand, Debug, Clone)]
enum Targets {
    #[command(subcommand)]
    Conn(OpCmd),
}

#[derive(Subcommand, Debug, Clone)]
enum OpCmd {
    List,
    Kill(KillOpt),
}

#[derive(Parser, Debug, Clone)]
struct KillOpt {
    id: String,
}

pub async fn run(opt: Opt) -> Result<()> {
    let mut client = proto_impl::CtlClient::new(&opt.ctl_target).await?;
    match opt.target {
        Targets::Conn(OpCmd::List) => {
            let res = client.conn_list().await?;
            let mut t = prettytable::Table::new();
            t.set_format(*prettytable::format::consts::FORMAT_NO_BORDER_LINE_SEPARATOR);
            t.set_titles(prettytable::row!["id", "name", "last_active", "pkt_buf"]);
            res.conns.iter().for_each(|conn| {
                let id = conn.id.clone();
                let name = match conn.name.clone() {
                    Some(name) => name,
                    None => "".to_string(),
                };
                let last_active = match conn.last_active.clone() {
                    Some(last_active) => last_active.to_string(),
                    None => "in_use".to_string(),
                };
                let pkt_buf = match conn.pkt_buf.clone() {
                    Some(pkt_buf) => pkt_buf,
                    None => 0,
                };
                t.add_row(prettytable::row![id, name, last_active, pkt_buf]);
            });
            t.printstd();
        }
        Targets::Conn(OpCmd::Kill(kill_opt)) => {
            client.conn_kill(&kill_opt.id).await?;
        }
    }
    Ok(())
}