summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs41
-rw-r--r--src/types.rs93
2 files changed, 87 insertions, 47 deletions
diff --git a/src/main.rs b/src/main.rs
index 5350945..bfc2330 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,44 +3,5 @@ mod types;
use types::*;
fn main() {
- let asset = Account {
- account_type: AccountType::Asset,
- path: "1".to_string(),
- name: "Asset".to_string(),
- description: "Asset".to_string()
- };
- let revenue = Account {
- account_type: AccountType::Revenue,
- path: "4".to_string(),
- name: "Revenue".to_string(),
- description: "Revenue".to_string()
- };
- let asset_debit = Transaction {
- transaction_type: TransactionType::Debit,
- account: asset,
- amount: 1000
- };
- let revenue_credit = Transaction {
- transaction_type: TransactionType::Credit,
- account: revenue,
- amount: 1000
- };
- let entry = JournalEntry {
- date: chrono::Utc::now(),
- transactions: vec![asset_debit, revenue_credit],
- balance: 1000,
- description: "Paycheck".to_string()
- };
- println!("date\t\t\t\t\taccount\tdebit\tcredit");
- print!("{}\t", entry.date);
- for t in &entry.transactions {
- if t.transaction_type == TransactionType::Debit {
- println!("{}\t{}", t.account.name, t.amount);
- }
- }
- for t in entry.transactions {
- if t.transaction_type == TransactionType::Credit {
- println!("\t\t\t\t\t{}\t\t{}", t.account.name, t.amount);
- }
- }
+ println!("Hello World!");
}
diff --git a/src/types.rs b/src/types.rs
index 2e83ea2..98af390 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -1,5 +1,34 @@
use chrono::{DateTime, Utc};
+use ulid::Ulid;
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
+pub struct AccountId(Ulid);
+
+impl AccountId {
+ pub fn as_ulid(&self) -> Ulid {
+ self.0
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
+pub struct PostingId(Ulid);
+
+impl PostingId {
+ pub fn as_ulid(&self) -> Ulid {
+ self.0
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
+pub struct JournalEntryId(Ulid);
+
+impl JournalEntryId {
+ pub fn as_ulid(&self) -> Ulid {
+ self.0
+ }
+}
+
+#[derive(PartialEq)]
pub enum AccountType {
Asset,
Liability,
@@ -9,26 +38,76 @@ pub enum AccountType {
}
pub struct Account {
- pub account_id: u32,
+ account_id: AccountId,
pub account_type: AccountType,
pub name: String,
- pub description: String,
+ pub description: String
+}
+
+pub struct NewAccount {
+ pub account_type: AccountType,
+ pub name: String,
+ pub description: String
+}
+
+impl NewAccount {
+ fn new(account_type: AccountType, name: impl Into<String>, description: impl Into<String>) -> NewAccount {
+ NewAccount {
+ account_type,
+ name: name.into(),
+ description: description.into()
+ }
+ }
}
#[derive(PartialEq)]
-pub enum TransactionType {
+pub enum PostingType {
Debit,
Credit
}
-pub struct Transaction {
- pub transaction_type: TransactionType,
- pub account_id: u32,
+pub struct Posting {
+ posting_id: PostingId,
+ pub posting_type: PostingType,
+ pub account_id: AccountId,
pub amount: u64
}
+pub struct NewPosting {
+ pub posting_type: PostingType,
+ pub account_id: AccountId,
+ pub amount: u64
+}
+
+impl NewPosting {
+ fn new(posting_type: PostingType, account_id: AccountId, amount: u64) -> NewPosting {
+ NewPosting {
+ posting_type,
+ account_id,
+ amount
+ }
+ }
+}
+
pub struct JournalEntry {
+ journal_entry_id: JournalEntryId,
pub date: DateTime<Utc>,
- pub transactions: Vec<Transaction>,
+ pub postings: Vec<Posting>,
pub description: String
}
+
+pub struct NewJournalEntry {
+ pub date: DateTime<Utc>,
+ pub postings: Vec<NewPosting>,
+ pub description: String
+}
+
+impl NewJournalEntry {
+ fn new(date: DateTime<Utc>, postings: Vec<NewPosting>, description: impl Into<String>) -> NewJournalEntry {
+ NewJournalEntry {
+ date,
+ postings,
+ description: description.into()
+ }
+ }
+}