diff options
Diffstat (limited to 'rust/schist_models/src')
| -rw-r--r-- | rust/schist_models/src/budget.rs | 43 | ||||
| -rw-r--r-- | rust/schist_models/src/budget_drip.rs | 14 | ||||
| -rw-r--r-- | rust/schist_models/src/budget_period_unit.rs | 112 | ||||
| -rw-r--r-- | rust/schist_models/src/budget_update.rs | 16 | ||||
| -rw-r--r-- | rust/schist_models/src/category.rs | 7 | ||||
| -rw-r--r-- | rust/schist_models/src/category_balance.rs | 7 | ||||
| -rw-r--r-- | rust/schist_models/src/category_budget.rs | 9 | ||||
| -rw-r--r-- | rust/schist_models/src/lib.rs | 6 | ||||
| -rw-r--r-- | rust/schist_models/src/schema.rs | 14 |
9 files changed, 144 insertions, 84 deletions
diff --git a/rust/schist_models/src/budget.rs b/rust/schist_models/src/budget.rs deleted file mode 100644 index 03261e5..0000000 --- a/rust/schist_models/src/budget.rs +++ /dev/null @@ -1,43 +0,0 @@ -use serde::Serialize; - -use super::budget_update::BudgetUpdate; - -#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize)] -pub struct Budget { - pub quantity: i32, - pub period: i32, -} - -impl From<&BudgetUpdate> for Budget { - fn from(budget_update: &BudgetUpdate) -> Self { - Self { - quantity: budget_update.new_budget, - period: budget_update.new_period, - } - } -} - -#[cfg(test)] -mod test { - use crate::date_utc::DateUtc; - use schist_traits::nowlike::Nowlike; - - use super::*; - - #[test] - fn when_from_budget_update_then_returns_budget() { - let quantity = 2; - let period = 3; - let budget_update = BudgetUpdate { - id: 0, - category_id: 1, - date: DateUtc::now(), - new_budget: quantity, - new_period: period, - }; - - let budget = Budget::from(&budget_update); - - assert_eq!(budget, Budget { quantity, period }); - } -} diff --git a/rust/schist_models/src/budget_drip.rs b/rust/schist_models/src/budget_drip.rs new file mode 100644 index 0000000..f467ecd --- /dev/null +++ b/rust/schist_models/src/budget_drip.rs @@ -0,0 +1,14 @@ +use derive_builder::Builder; +use diesel::prelude::{Identifiable, Insertable, Queryable, Selectable}; +use serde::{Deserialize, Serialize}; + +use crate::date_utc::DateUtc; + +#[derive(Builder, Queryable, Identifiable, Selectable, Debug, PartialEq, Serialize, Deserialize, Insertable)] +#[diesel(table_name = crate::schema::budget_drips)] +pub struct BudgetDrip { + pub id: i32, + pub category_id: i32, + pub date: DateUtc, + pub quantity: i32, +} diff --git a/rust/schist_models/src/budget_period_unit.rs b/rust/schist_models/src/budget_period_unit.rs new file mode 100644 index 0000000..77d8641 --- /dev/null +++ b/rust/schist_models/src/budget_period_unit.rs @@ -0,0 +1,112 @@ +use core::fmt; +use std::str::FromStr; + +use anyhow::{Result, bail}; +use diesel::{backend::Backend, deserialize::{self, FromSql, FromSqlRow}, expression::AsExpression, serialize::{self, ToSql}, sql_types::Text, sqlite::Sqlite}; +use serde::{Deserialize, Serialize}; + +#[derive( + Eq, + PartialEq, + Serialize, + Deserialize, + Clone, + Debug, + AsExpression, + FromSqlRow, +)] +#[diesel(sql_type=Text)] +pub enum BudgetPeriodUnit { + Day, + Month, + Year, +} + +impl fmt::Display for BudgetPeriodUnit { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + BudgetPeriodUnit::Day => "DAY".fmt(f), + BudgetPeriodUnit::Month => "MONTH".fmt(f), + BudgetPeriodUnit::Year => "YEAR".fmt(f), + } + } +} + +impl FromStr for BudgetPeriodUnit { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result<Self> { + match s { + "DAY" => Ok(BudgetPeriodUnit::Day), + "MONTH" => Ok(BudgetPeriodUnit::Month), + "YEAR" => Ok(BudgetPeriodUnit::Year), + _ => bail!("\"{}\" is not a valid budget period unit. Valid values are: DAY, MONTH, YEAR", s), + } + } +} + +impl ToSql<Text, Sqlite> for BudgetPeriodUnit { + fn to_sql<'b>( + &'b self, + out: &mut diesel::serialize::Output<'b, '_, Sqlite>, + ) -> serialize::Result { + out.set_value(self.to_string()); + Ok(serialize::IsNull::No) + } +} + +impl FromSql<Text, Sqlite> for BudgetPeriodUnit { + fn from_sql(bytes: <Sqlite as Backend>::RawValue<'_>) -> deserialize::Result<BudgetPeriodUnit> { + let str = <String as FromSql<Text, Sqlite>>::from_sql(bytes)?; + Ok(str.parse()?) + } +} + +#[cfg(test)] +mod test { + use anyhow::Result; + + use super::BudgetPeriodUnit; + + #[test] + fn display_when_day_then_day() { + assert_eq!("DAY", format!("{}", BudgetPeriodUnit::Day)); + } + + #[test] + fn display_when_month_then_month() { + assert_eq!("MONTH", format!("{}", BudgetPeriodUnit::Month)); + } + + #[test] + fn display_when_year_then_year() { + assert_eq!("YEAR", format!("{}", BudgetPeriodUnit::Year)); + } + + #[test] + fn from_str_when_day_then_day() { + let result: Result<BudgetPeriodUnit> = "DAY".parse(); + assert!(result.is_ok()); + assert_eq!(BudgetPeriodUnit::Day, result.unwrap()); + } + + #[test] + fn from_str_when_month_then_month() { + let result: Result<BudgetPeriodUnit> = "MONTH".parse(); + assert!(result.is_ok()); + assert_eq!(BudgetPeriodUnit::Month, result.unwrap()); + } + + #[test] + fn from_str_when_year_then_year() { + let result: Result<BudgetPeriodUnit> = "YEAR".parse(); + assert!(result.is_ok()); + assert_eq!(BudgetPeriodUnit::Year, result.unwrap()); + } + + #[test] + fn from_str_when_sentence_case_day_then_err() { + let result: Result<BudgetPeriodUnit> = "Day".parse(); + assert!(result.is_err()); + } +} diff --git a/rust/schist_models/src/budget_update.rs b/rust/schist_models/src/budget_update.rs deleted file mode 100644 index 86645cb..0000000 --- a/rust/schist_models/src/budget_update.rs +++ /dev/null @@ -1,16 +0,0 @@ -use derive_builder::Builder; -use diesel::prelude::*; -use serde::Serialize; - -use crate::{category::Category, date_utc::DateUtc}; - -#[derive(Builder, Clone, Serialize, Queryable, Identifiable, Selectable, Associations, Debug, PartialEq, Eq, Insertable)] -#[diesel(table_name = crate::schema::budget_updates)] -#[diesel(belongs_to(Category))] -pub struct BudgetUpdate { - pub id: i32, - pub category_id: i32, - pub date: DateUtc, - pub new_budget: i32, - pub new_period: i32, -} diff --git a/rust/schist_models/src/category.rs b/rust/schist_models/src/category.rs index 55c7b97..c85ff51 100644 --- a/rust/schist_models/src/category.rs +++ b/rust/schist_models/src/category.rs @@ -2,9 +2,16 @@ use derive_builder::Builder; use diesel::prelude::*; use serde::{Deserialize, Serialize}; +use crate::{budget_period_unit::BudgetPeriodUnit, date_utc::DateUtc}; + #[derive(Builder, Queryable, Identifiable, Selectable, Debug, PartialEq, Serialize, Deserialize, Insertable)] #[diesel(table_name = crate::schema::categories)] pub struct Category { pub id: i32, pub name: String, + pub balance: i32, + pub balance_date: DateUtc, + pub budget_period: i32, + pub budget_period_unit: BudgetPeriodUnit, + pub budget_quantity: i32, } diff --git a/rust/schist_models/src/category_balance.rs b/rust/schist_models/src/category_balance.rs deleted file mode 100644 index 796b40b..0000000 --- a/rust/schist_models/src/category_balance.rs +++ /dev/null @@ -1,7 +0,0 @@ -use serde::Serialize; - -#[derive(Serialize)] -pub struct CategoryBalance { - pub category_id: i32, - pub balance: i32, -} diff --git a/rust/schist_models/src/category_budget.rs b/rust/schist_models/src/category_budget.rs deleted file mode 100644 index 9796261..0000000 --- a/rust/schist_models/src/category_budget.rs +++ /dev/null @@ -1,9 +0,0 @@ -use serde::Serialize; - -use super::budget::Budget; - -#[derive(Serialize)] -pub struct CategoryBudget { - pub category_id: i32, - pub budget: Option<Budget>, -} diff --git a/rust/schist_models/src/lib.rs b/rust/schist_models/src/lib.rs index 9e60e80..1712c36 100644 --- a/rust/schist_models/src/lib.rs +++ b/rust/schist_models/src/lib.rs @@ -1,9 +1,7 @@ pub mod account; -pub mod budget; -pub mod budget_update; +pub mod budget_drip; +pub mod budget_period_unit; pub mod category; -pub mod category_balance; -pub mod category_budget; pub mod category_transfer; pub mod date_utc; pub mod datetime_utc; diff --git a/rust/schist_models/src/schema.rs b/rust/schist_models/src/schema.rs index 372f8f3..5164d07 100644 --- a/rust/schist_models/src/schema.rs +++ b/rust/schist_models/src/schema.rs @@ -10,12 +10,11 @@ diesel::table! { } diesel::table! { - budget_updates (id) { + budget_drips (id) { id -> Integer, category_id -> Integer, date -> Text, - new_budget -> Integer, - new_period -> Integer, + quantity -> Integer, } } @@ -23,6 +22,11 @@ diesel::table! { categories (id) { id -> Integer, name -> Text, + balance -> Integer, + balance_date -> Text, + budget_period -> Integer, + budget_period_unit -> Text, + budget_quantity -> Integer, } } @@ -57,14 +61,14 @@ diesel::table! { } } -diesel::joinable!(budget_updates -> categories (category_id)); +diesel::joinable!(budget_drips -> categories (category_id)); diesel::joinable!(transaction_categorisations -> categories (category_id)); diesel::joinable!(transaction_categorisations -> transactions (transaction_id)); diesel::joinable!(transactions -> accounts (account_id)); diesel::allow_tables_to_appear_in_same_query!( accounts, - budget_updates, + budget_drips, categories, category_transfers, transaction_categorisations, |
