sqlx_ledger/journal/
entity.rs

1use chrono::{DateTime, Utc};
2use derive_builder::Builder;
3
4use crate::primitives::*;
5
6/// Representation of a ledger journal entity.
7pub struct Journal {
8    pub id: JournalId,
9    pub name: String,
10    pub description: Option<String>,
11    pub status: Status,
12    pub version: u32,
13    pub modified_at: DateTime<Utc>,
14    pub created_at: DateTime<Utc>,
15}
16
17/// Representation of a new ledger journal entity
18/// with required/optional properties and a builder.
19#[derive(Debug, Builder)]
20pub struct NewJournal {
21    #[builder(setter(into))]
22    pub id: JournalId,
23    #[builder(setter(into))]
24    pub(super) name: String,
25    #[builder(setter(strip_option, into), default)]
26    pub(super) description: Option<String>,
27    #[builder(default)]
28    pub(super) status: Status,
29}
30
31impl NewJournal {
32    pub fn builder() -> NewJournalBuilder {
33        let mut builder = NewJournalBuilder::default();
34        builder.id(JournalId::new());
35        builder
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn it_builds() {
45        let new_journal = NewJournal::builder().name("name").build().unwrap();
46        assert_eq!(new_journal.name, "name");
47        assert_eq!(new_journal.description, None);
48        assert_eq!(new_journal.status, Status::Active);
49    }
50
51    #[test]
52    fn fails_when_mandatory_fields_are_missing() {
53        let new_journal = NewJournal::builder().build();
54        assert!(new_journal.is_err());
55    }
56}