sshy 0.1.2

TUI application to make SSH configuration easier
use ratatui::{
    layout::{Constraint, Direction, Layout, Rect},
    Frame,
};

pub struct AppLayout {
    pub known_hosts_list: Rect,
    pub public_keys_list: Rect,
    pub client_config: Rect,
    pub main_footer: Rect,
}

impl AppLayout {
    pub fn from_frame(f: &Frame) -> AppLayout {
        let frame_rect = f.area();

        let main_footer_rect = AppLayout::calc_main_footer_rect(&frame_rect);
        let known_hosts_list_rect = AppLayout::calc_known_hosts_list_rect(&frame_rect);
        let public_keys_list_rect = AppLayout::calc_public_keys_list_rect(&frame_rect);
        let client_config_rect = AppLayout::calc_client_config_rect(&frame_rect);

        AppLayout {
            known_hosts_list: known_hosts_list_rect,
            public_keys_list: public_keys_list_rect,
            client_config: client_config_rect,
            main_footer: main_footer_rect,
        }
    }

    fn calc_main_footer_rect(frame_rect: &Rect) -> Rect {
        Layout::default()
            .direction(Direction::Vertical)
            .constraints([Constraint::Fill(1), Constraint::Length(3)])
            .split(*frame_rect)[1]
    }

    fn calc_known_hosts_list_rect(rect: &Rect) -> Rect {
        let columns = Layout::default()
            .direction(Direction::Horizontal)
            .constraints([Constraint::Percentage(33)])
            .split(*rect);

        Layout::default()
            .direction(Direction::Vertical)
            .constraints([Constraint::Percentage(50), Constraint::Percentage(50), Constraint::Length(3)])
            .split(columns[0])[0]
    }

    fn calc_public_keys_list_rect(rect: &Rect) -> Rect {
        let columns = Layout::default()
            .direction(Direction::Horizontal)
            .constraints([Constraint::Percentage(33)])
            .split(*rect);

        Layout::default()
            .direction(Direction::Vertical)
            .constraints([Constraint::Percentage(50), Constraint::Percentage(50), Constraint::Length(3)])
            .split(columns[0])[1]
    }

    fn calc_client_config_rect(rect: &Rect) -> Rect {
        let columns = Layout::default()
            .direction(Direction::Horizontal)
            .constraints([Constraint::Percentage(33), Constraint::Fill(1)])
            .split(*rect);

        Layout::default()
            .direction(Direction::Vertical)
            .constraints([Constraint::Percentage(100), Constraint::Length(3)])
            .split(columns[1])[0]
    }
}