term-sesh 0.1.12

Unix terminal session manager
use log::info;
use sesh_proto::{SeshResizeResponse, WinSize};
use sesh_shared::term::Size;

use crate::Seshd;
use sesh_proto::sesh_resize_request as req;

use super::CommandResponse;
use anyhow::Result;

impl Seshd {
    pub async fn exec_resize(
        &self,
        session: Option<req::Session>,
        size: Option<WinSize>,
    ) -> Result<CommandResponse> {
        let Some(size) = size else {
            return Err(anyhow::anyhow!("Invalid size"));
        };
        let Some(session) = session else {
            return Err(anyhow::anyhow!("Session not found"));
        };
        let Some(name) = (match session {
            req::Session::Name(name) => Some(name),
            req::Session::Id(id) => self.sessions.iter().find_map(|e| {
                let session = e.value();
                if session.id == id as usize {
                    Some(session.name.clone())
                } else {
                    None
                }
            }),
        }) else {
            return Err(anyhow::anyhow!("Session not found"));
        };
        let session = self
            .sessions
            .get(&name)
            .ok_or_else(|| anyhow::anyhow!("Session not found: {}", name))?;
        info!(target: &session.log_group(), "Resizing");

        session.pty.resize(&Size {
            cols: size.cols as u16,
            rows: size.rows as u16,
        })?;
        Ok(CommandResponse::ResizeSession(SeshResizeResponse {}))
    }
}