graphic_walker_parser/parser/model/
workflow.rs

1use std::{collections::HashMap, f64};
2
3use serde_derive::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6#[serde(tag = "type")]
7pub enum Workflow {
8    #[serde(rename = "view")]
9    View { query: Vec<Query> },
10    #[serde(rename = "filter")]
11    Filter { filters: Vec<Filter> },
12    #[serde(rename = "transform")]
13    Transform { transform: Vec<Transform> },
14    #[serde(rename = "sort")]
15    Sort { by: Vec<String>, sort: Sort },
16}
17
18#[derive(Clone, Debug, Serialize, Deserialize)]
19#[serde(tag = "op")]
20pub enum Query {
21    #[serde(rename = "raw")]
22    Raw { fields: Vec<String> },
23    #[serde(rename = "aggregate")]
24    #[serde(rename_all = "camelCase")]
25    Aggregate {
26        #[serde(default)]
27        group_by: Vec<String>,
28        #[serde(default)]
29        measures: Vec<Measure>,
30    },
31}
32
33#[derive(Clone, Debug, Serialize, Deserialize)]
34pub struct Filter {
35    #[serde(default)]
36    pub fid: String,
37    #[serde(default)]
38    pub key: String,
39    pub rule: Rule,
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize)]
43pub struct Transform {
44    pub expression: Expression,
45}
46
47#[derive(Clone, Debug, Serialize, Deserialize)]
48pub struct Expression {
49    pub op: TransformOp,
50    #[serde(rename = "as")]
51    pub as_field_key: String,
52    pub num: Option<i64>,
53    pub params: Option<Vec<ExpParameter>>,
54}
55
56#[derive(Clone, Debug, Serialize, Deserialize)]
57pub enum TransformOp {
58    #[serde(rename = "one")]
59    One,
60    #[serde(rename = "bin")]
61    Bin,
62    #[serde(rename = "binCount")]
63    BinCount,
64    #[serde(rename = "log2")]
65    Log2,
66    #[serde(rename = "log10")]
67    Log10,
68    #[serde(rename = "log")]
69    Log,
70    #[serde(rename = "dateTimeDrill")]
71    DateTimeDrill,
72    #[serde(rename = "dateTimeFeature")]
73    DateTimeFeature,
74    #[serde(rename = "expr")]
75    Expr,
76    #[serde(rename = "paint")]
77    Paint,
78}
79
80#[derive(Clone, Debug, Serialize, Deserialize)]
81pub struct ExpParameter {
82    #[serde(rename = "type")]
83    pub r#type: String,
84    pub value: ValueParam,
85}
86
87#[derive(Clone, Debug, Serialize, Deserialize)]
88#[serde(untagged)]
89pub enum ValueParam {
90    Map(MapParameter),
91    String(String),
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95#[serde(rename_all = "camelCase")]
96pub struct MapParameter {
97    pub x: String,
98    pub y: String,
99    pub domain_x: Vec<f64>,
100    pub domain_y: Vec<f64>,
101    pub map: String,
102    pub dict: HashMap<String, Dict>,
103    pub mapwidth: i64,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct Dict {
108    pub name: String,
109}
110
111#[derive(Clone, Debug, Serialize, Deserialize)]
112pub struct Rule {
113    #[serde(rename = "type")]
114    pub rule_type: RuleType,
115    pub value: Vec<JsonValue>,
116}
117
118#[derive(Clone, Debug, Serialize, Deserialize)]
119pub enum RuleType {
120    #[serde(rename = "range")]
121    Range,
122    #[serde(rename = "one of")]
123    OneOf,
124    #[serde(rename = "temporal range")]
125    Temporal,
126    #[serde(rename = "not in")]
127    NotIn,
128}
129
130#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq)]
131pub enum Sort {
132    #[serde(rename = "ascending")]
133    Asc,
134    #[serde(rename = "descending")]
135    Desc,
136    #[serde(rename = "")]
137    #[default]
138    None,
139}
140
141#[derive(Clone, Debug, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct Measure {
144    pub field: String,
145    pub agg: Agg,
146    pub as_field_key: String,
147    pub format: Option<String>,
148}
149
150#[derive(Clone, Debug, Serialize, Deserialize)]
151pub enum Agg {
152    #[serde(rename = "sum")]
153    Sum,
154    #[serde(rename = "count")]
155    Count,
156    #[serde(rename = "min")]
157    Min,
158    #[serde(rename = "max")]
159    Max,
160    #[serde(rename = "median")]
161    Median,
162    #[serde(rename = "variance")]
163    Variance,
164    #[serde(rename = "stdev")]
165    StdDev,
166    #[serde(rename = "mean")]
167    Mean,
168    #[serde(rename = "distinctCount")]
169    DistinctCount,
170    #[serde(rename = "")]
171    None,
172}
173
174/// A JSON value represented as a Rust type.
175#[derive(Debug, Serialize, Deserialize)]
176#[serde(untagged)]
177pub enum JsonValue {
178    Int(i64),
179    Float64(f64),
180    String(String),
181}
182
183impl Clone for JsonValue {
184    fn clone(&self) -> Self {
185        match self {
186            JsonValue::Int(i) => JsonValue::Int(*i),
187            JsonValue::String(s) => JsonValue::String(s.clone()),
188            JsonValue::Float64(f) => JsonValue::Float64(*f),
189        }
190    }
191}