hiqlite 0.13.0

Hiqlite - highly-available, embeddable, raft-based SQLite + cache
use crate::dashboard::handlers::TableFilterRequest;
use crate::network::AppStateExt;
use crate::query::query_map;
use crate::{Error, Param, Params};
use serde::Serialize;

#[derive(Debug, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum TableType {
    Table,
    Index,
    View,
    Trigger,
}

impl From<&str> for TableType {
    fn from(value: &str) -> Self {
        match value {
            "table" => Self::Table,
            "index" => Self::Index,
            "view" => Self::View,
            "trigger" => Self::Trigger,
            _ => unreachable!(),
        }
    }
}

#[derive(Debug, Serialize)]
pub struct Table {
    typ: TableType,
    name: String,
    tbl_name: String,
    sql: Option<String>,
}

impl From<&mut crate::Row<'_>> for Table {
    fn from(row: &mut crate::Row<'_>) -> Self {
        Self {
            typ: TableType::from(row.get::<String>("type").as_str()),
            name: row.get("name"),
            tbl_name: row.get("tbl_name"),
            sql: row.try_get("sql").ok(),
        }
    }
}

impl Table {
    pub async fn find_all(state: &AppStateExt) -> Result<Vec<Self>, Error> {
        let res: Vec<Self> = query_map(
            state,
            "SELECT type,name,tbl_name,sql FROM sqlite_master",
            Params::new(),
        )
        .await?;

        Ok(res)
    }

    pub async fn find_all_filtered(
        state: &AppStateExt,
        filter: TableFilterRequest,
    ) -> Result<Vec<Self>, Error> {
        let res: Vec<Self> = query_map(
            state,
            "SELECT type,name,tbl_name,sql FROM sqlite_master WHERE type = $1",
            vec![Param::Text(filter.as_str().to_string())],
        )
        .await?;

        Ok(res)
    }
}