tabiew 0.16.0

A lightweight TUI application to view and query tabular data files, such as CSV, TSV, and parquet.
use polars::datatypes::DataType;
use serde::{Deserialize, Serialize};

use crate::tui;

#[derive(Debug, Serialize, Deserialize)]
pub struct Tabs {
    tabs: Vec<Pane>,
    selected: usize,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Pane {
    table_stack: Vec<Table>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Table {
    schema: Vec<Field>,
    offset: usize,
    rendered_rows: usize,
    description: Description,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Field {
    name: String,
    dtype: DataType,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Description {
    key: String,
    val: String,
}

impl From<&tui::tabs::Tabs> for Tabs {
    fn from(value: &tui::tabs::Tabs) -> Self {
        Self {
            tabs: value.iter().map(Pane::from).collect(),
            selected: value.idx(),
        }
    }
}

impl From<&tui::Pane> for Pane {
    fn from(value: &tui::Pane) -> Self {
        Self {
            table_stack: value
                .iter_tables()
                .zip(value.iter_descriptions())
                .map(|(table, description)| Table::new(table, description))
                .collect(),
        }
    }
}

impl Table {
    fn new(table: &tui::table::Table, description: &tui::pane::TableDescription) -> Self {
        Self {
            schema: table
                .data_frame()
                .schema()
                .iter()
                .map(|(name, dtype)| Field {
                    name: name.to_string(),
                    dtype: dtype.clone(),
                })
                .collect(),
            offset: table.offset(),
            rendered_rows: table.rendered_rows(),
            description: description.into(),
        }
    }
}

impl From<&tui::pane::TableDescription> for Description {
    fn from(value: &tui::pane::TableDescription) -> Self {
        Self {
            key: value.variant().to_owned(),
            val: value.description().to_owned(),
        }
    }
}