Extract Amount into separate crate

korrat
Jun 23, 2023, 6:32 PM
XWHISGCP3WZJHEQXEFFGHR5JDVOD7NMRH5ZPWFVTWQPA5XJBZKNQC

Dependencies

  • [2] TB2QGHXN Upgrade dependencies
  • [3] WS3UUOV3 Extract commodity type into separate crate
  • [4] R7S2CWF7 Add type for account segments
  • [5] R524JUUE Implement metadata & price directives
  • [6] 6MR76MLL Replace build script with cargo-px
  • [7] SEEWF7KX Implement metadata on transactions
  • [8] W3MWSSJ7 Add a templating engine for accounts
  • [9] SMBQYFPG Enable access to timestamps for directives
  • [10] 2JBFREZG enable additional warnings
  • [11] NG5QXPZH Extract Account into separate crate
  • [12] RI7HQBYA Add generator and parser for ISO20022 messages
  • [13] YDK6X6PP add a library of important types for beancount
  • [*] I2P2FTLE add basic parser for german decimals
  • [*] UESS5YZE migrate dependencies into workspace manifest
  • [*] ZVTVMOZQ Upgrade dependencies
  • [*] 4W4CDACX Upgrade dependencies

Change contents

  • file deletion: that.rs (---r------)
    [4.44][4.2426:2457](),[4.2457][4.2458:2458]()
    mod amount {
    use {
    crate::Amount,
    core::{fmt::Debug, hash::Hash, str::FromStr},
    static_assertions::assert_impl_all,
    test_case::test_case,
    };
    assert_impl_all!(
    Amount: Copy,
    Debug,
    FromStr,
    Hash,
    PartialOrd,
    TryFrom<&'static str>
    );
    #[test_case("0 EUR"; "zero")]
    #[test_case("15 USD"; "integer amount")]
    #[test_case("0.30 CAD"; "fractional amount")]
    #[test_case("0.0000067 ETH"; "arbitrary precision")]
    #[test_case("-16.93 USD"; "negative amount")]
    fn parse_when_valid(amount: &str) {
    let account = Amount::try_from(amount).unwrap();
    assert_eq!(account.to_string(), amount);
    }
    #[test_case(" EUR"; "missing units")]
    #[test_case("15 "; "missing commodity")]
    #[test_case("15,000.00 USD"; "thousands separator")]
    #[test_case("15000,00 USD"; "invalid decimal separator")]
    fn do_not_parse_when_invalid(amount: &str) {
    Amount::try_from(amount).unwrap_err();
    }
    }
  • edit in common/beancount-types/src/lib.rs at line 9
    [4.2176]
    [3.1752]
    pub use beancount_amount::Amount;
  • edit in common/beancount-types/src/lib.rs at line 13
    [4.83][4.4092:4123](),[4.4092][4.4092:4123]()
    pub use crate::amount::Amount;
  • edit in common/beancount-types/src/lib.rs at line 35
    [4.5928][4.5928:5940]()
    mod amount;
  • replacement in common/beancount-types/src/lib.rs at line 55
    [4.11133][4.11133:11176]()
    Directive::Balance(inner) => {
    [4.11133]
    [4.11176]
    Self::Balance(inner) => {
  • replacement in common/beancount-types/src/lib.rs at line 58
    [4.11234][4.11234:11275]()
    Directive::Price(inner) => {
    [4.11234]
    [4.11275]
    Self::Price(inner) => {
  • replacement in common/beancount-types/src/lib.rs at line 61
    [4.11333][4.11333:11380]()
    Directive::Transaction(inner) => {
    [4.11333]
    [4.11380]
    Self::Transaction(inner) => {
  • edit in common/beancount-types/src/lib.rs at line 136
    [4.7523][4.7523:7547]()
    #[cfg(test)]
    mod that;
  • edit in common/beancount-types/src/cost.rs at line 1
    [4.7580][4.7581:7608]()
    use crate::amount::Amount;
  • edit in common/beancount-types/src/cost.rs at line 6
    [4.7653]
    [4.7450]
    use crate::Amount;
  • replacement in common/beancount-types/src/account.rs at line 1
    [4.1838][4.1839:1864]()
    pub(crate) mod template;
    [4.1838]
    pub mod template;
  • edit in common/beancount-types/Cargo.toml at line 27
    [3.1853]
    [3.1853]
    beancount-amount.path = "../../beancount/amount"
  • file addition: amount (d--r------)
    [4.1]
  • file addition: tests (d--r------)
    [0.1]
  • file addition: basic.rs (---r------)
    [0.21]
    use core::fmt::Debug;
    use core::hash::Hash;
    use core::str::FromStr;
    use beancount_amount::Amount;
    use static_assertions::assert_impl_all;
    use test_case::test_case;
    assert_impl_all!(
    Amount: Copy,
    Debug,
    FromStr,
    Hash,
    PartialOrd,
    TryFrom<&'static str>
    );
    #[test_case("0 EUR"; "zero")]
    #[test_case("15 USD"; "integer amount")]
    #[test_case("0.30 CAD"; "fractional amount")]
    #[test_case("0.0000067 ETH"; "arbitrary precision")]
    #[test_case("-16.93 USD"; "negative amount")]
    fn parse_when_valid(amount: &str) {
    let account = Amount::try_from(amount).unwrap();
    assert_eq!(account.to_string(), amount);
    }
    #[test_case(" EUR"; "missing units")]
    #[test_case("15 "; "missing commodity")]
    #[test_case("15,000.00 USD"; "thousands separator")]
    #[test_case("15000,00 USD"; "invalid decimal separator")]
    fn do_not_parse_when_invalid(amount: &str) {
    Amount::try_from(amount).unwrap_err();
    }
  • file addition: src (d--r------)
    [0.1]
  • file move: amount.rs (---r------)lib.rs (---r------)
    [0.991]
    [4.9836]
  • edit in beancount/amount/src/lib.rs at line 1
    [4.9836]
    [4.6396]
    #![warn(clippy::all, clippy::nursery, clippy::pedantic)]
  • edit in beancount/amount/src/lib.rs at line 19
    [4.6736]
    [4.9859]
    use beancount_commodity::Commodity;
    use miette::Diagnostic;
  • edit in beancount/amount/src/lib.rs at line 25
    [4.9953][4.6737:6760]()
    use crate::Commodity;
  • replacement in beancount/amount/src/lib.rs at line 139
    [4.91793401][4.91793401:91793465]()
    pub fn new(amount: Decimal, commodity: Commodity) -> Self {
    [4.91793401]
    [4.7676]
    pub const fn new(amount: Decimal, commodity: Commodity) -> Self {
  • replacement in beancount/amount/src/lib.rs at line 308
    [4.11333][4.11333:11357]()
    #[derive(Debug, Snafu)]
    [4.11333]
    [4.11357]
    #[derive(Debug, Diagnostic, Snafu)]
  • file addition: Cargo.toml (---r------)
    [0.1]
    [package]
    name = "beancount-amount"
    edition.workspace = true
    publish.workspace = true
    rust-version.workspace = true
    version.workspace = true
    [dependencies]
    # Inherited dependencies
    delegate.workspace = true
    lazy-regex.workspace = true
    miette.workspace = true
    momo.workspace = true
    rust_decimal.workspace = true
    serde.workspace = true
    snafu.workspace = true
    # Workspace dependencies
    beancount-commodity.workspace = true
    [dev-dependencies]
    static_assertions.workspace = true
    test-case.workspace = true
  • edit in Cargo.toml at line 32
    [4.2918]
    [2.165]
    forward_ref_generic = "0.2.1"
  • replacement in Cargo.toml at line 58
    [2.454][4.91793892:91793924](),[4.3449][4.91793892:91793924]()
    quick-xml = "0.28.2"
    [2.454]
    [2.455]
    quick-xml = "0.29.0"
  • edit in Cargo.toml at line 119
    [16.1750]
    [16.1750]
    ## Workspace crates
    [workspace.dependencies.beancount-commodity]
    path = "beancount/commodity"
  • edit in Cargo.lock at line 218
    [17.279]
    [3.2346]
    name = "beancount-amount"
    version = "0.0.0-dev.0"
    dependencies = [
    "beancount-commodity",
    "delegate",
    "lazy-regex",
    "miette",
    "momo",
    "rust_decimal",
    "serde",
    "snafu",
    "static_assertions",
    "test-case",
    ]
    [[package]]
  • edit in Cargo.lock at line 343
    [18.2353]
    [3.2540]
    "beancount-amount",
  • replacement in Cargo.lock at line 3081
    [4.91799719][4.91799719:91799738]()
    version = "0.28.2"
    [4.91799719]
    [4.91799738]
    version = "0.29.0"
  • replacement in Cargo.lock at line 3083
    [4.91799803][4.91799803:91799881]()
    checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1"
    [4.91799803]
    [4.91799881]
    checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51"