diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..23fd35f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/src/graph.rs b/src/graph.rs new file mode 100644 index 0000000..8f4d728 --- /dev/null +++ b/src/graph.rs @@ -0,0 +1,142 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub enum NodeConfiguration { + FileNode, + MoveMoneyNode(MoveMoneyNode), + MergeNode(MergeNode), + DeriveNode(DeriveNode), +} + +#[derive(Serialize, Deserialize)] +pub struct NodeInfo { + pub name: String, + pub output_files: Vec, + pub configuration: NodeConfiguration, +} + +#[derive(Serialize, Deserialize)] +pub enum MoveMoneyAmountType { + Percent, + Amount, +} + +#[derive(Serialize, Deserialize)] +pub struct MoveMoneyRule { + pub from_account: String, + pub from_cc: String, + pub to_account: String, + pub to_cc: String, + pub value: f64, + pub amount_type: MoveMoneyAmountType, +} + +#[derive(Serialize, Deserialize)] +pub struct MoveMoneyNode { + pub departments_path: String, + pub accounts_path: String, + pub gl_path: String, + pub rules: Vec, +} + +#[derive(Serialize, Deserialize)] +pub enum JoinType { + Left, + Inner, + Right, +} + +#[derive(Serialize, Deserialize)] +pub struct MergeJoin { + pub join_type: JoinType, + pub left_column_name: String, + pub right_column_name: String, +} + +#[derive(Serialize, Deserialize)] +pub struct MergeNode { + pub input_files: Vec, + pub joins: Vec, +} + +#[derive(Serialize, Deserialize)] +pub enum DeriveColumnType { + Column(String), + Constant(String), +} + +#[derive(Serialize, Deserialize)] +pub struct MapOperation { + pub mapped_value: String, +} + +#[derive(Serialize, Deserialize)] +pub enum DatePart { + Year, + Month, + Week, + Day, + Hour, + Minute, + Second, +} + +#[derive(Serialize, Deserialize)] +pub enum SplitType { + DateTime(String, DatePart), + Numeric(String, isize), +} + +#[derive(Serialize, Deserialize)] +pub enum MatchComparisonType { + Equal, + GreaterThan, + LessThan, +} + +#[derive(Serialize, Deserialize)] +pub enum DeriveOperation { + Concat(Vec), + Add(Vec), + Multiply(Vec), + Subtract(DeriveColumnType, DeriveColumnType), + Divide(DeriveColumnType, DeriveColumnType), + Map(String, Vec), + Split(String, SplitType), +} + +#[derive(Serialize, Deserialize)] +pub struct DeriveFilter { + pub column_name: String, + pub comparator: MatchComparisonType, + pub match_value: String, +} + +#[derive(Serialize, Deserialize)] +pub struct DeriveRule { + pub operations: Vec, + pub filters: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct DeriveNode { + pub rules: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct Node { + pub id: i64, + pub info: NodeInfo, + pub dependent_node_ids: Vec, +} + +impl Node { + pub fn has_dependent_nodes(&self) -> bool { + !self.dependent_node_ids.is_empty() + } +} + +pub struct Graph { + pub name: String, + pub nodes: Vec, +} diff --git a/src/lib.rs b/src/lib.rs index dc94163..fb43b19 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,7 @@ pub mod filter; pub mod upload_to_db; mod io; +mod graph; #[no_mangle] pub extern "C" fn move_money_from_text(