use serde::{Deserialize, Serialize};
use strum::EnumDiscriminants;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, EnumDiscriminants)]
#[strum_discriminants(derive(Serialize, Deserialize))]
#[strum_discriminants(name(SurfaceKind))]
pub enum Surface {
Table {
columns: Vec<Column>,
},
Tree {
columns: Vec<Column>,
},
Graph,
Form {
fields: Vec<Field>,
},
Matrix {
row_axis: Vec<String>,
col_axis: Vec<String>,
},
Stream,
Editor {
mode: EditorMode,
},
Chart,
Terminal,
}
impl Surface {
pub fn kind(&self) -> SurfaceKind {
SurfaceKind::from(self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SupportLevel {
Full,
Alternate,
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Projection {
Tui,
Gui,
Browser,
}
pub fn support_level(projection: Projection, kind: SurfaceKind) -> SupportLevel {
use Projection::*;
use SupportLevel::*;
use SurfaceKind::*;
match (projection, kind) {
(_, Table) => Full,
(_, Tree) => Full,
(_, Form) => Full,
(_, Matrix) => Full,
(_, Stream) => Full,
(_, Chart) => Full,
(Tui, Graph) => Alternate,
(Gui, Graph) => Full,
(Browser, Graph) => Full,
(Tui, Editor) => Alternate,
(Gui, Editor) => Full,
(Browser, Editor) => Full,
(Tui, Terminal) => Full,
(Gui, Terminal) => Full,
(Browser, Terminal) => Full,
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum EditorMode {
Single,
Diff { left: String, right: String },
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Column {
pub id: String,
pub header_key: String,
pub kind: ColumnKind,
pub sortable: bool,
#[serde(default)]
pub field: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ColumnKind {
Text,
Number,
Timestamp,
Status,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Field {
pub id: String,
pub label_key: String,
pub kind: FieldKind,
pub required: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum FieldKind {
Text,
Number,
Bool,
Choice {
options: Vec<String>,
},
}