tackler_core/kernel/
report_settings.rs

1/*
2 * Tackler-NG 2025
3 * SPDX-License-Identifier: Apache-2.0
4 */
5use crate::config::{BalanceType, Scale};
6use crate::kernel::Settings;
7use crate::kernel::price_lookup::PriceLookup;
8use crate::model::Commodity;
9use crate::tackler;
10use jiff::tz::TimeZone;
11use std::sync::Arc;
12use tackler_api::txn_ts::{GroupBy, TimestampStyle};
13
14#[derive(Debug, Clone)]
15pub struct BalanceSettings {
16    pub(crate) title: String,
17    pub(crate) bal_type: BalanceType,
18    pub(crate) ras: Vec<String>,
19    pub(crate) scale: Scale,
20    pub(crate) report_commodity: Option<Arc<Commodity>>,
21    pub(crate) price_lookup: PriceLookup,
22}
23
24impl TryFrom<&Settings> for BalanceSettings {
25    type Error = tackler::Error;
26
27    fn try_from(settings: &Settings) -> Result<Self, Self::Error> {
28        Ok(BalanceSettings {
29            title: settings.report.balance.title.clone(),
30            bal_type: settings.report.balance.bal_type.clone(),
31            ras: settings.get_balance_ras(),
32            scale: settings.report.scale.clone(),
33            report_commodity: settings.get_report_commodity(),
34            price_lookup: settings.get_price_lookup(),
35        })
36    }
37}
38
39#[derive(Debug, Clone)]
40pub struct BalanceGroupSettings {
41    pub title: String,
42    pub bal_type: BalanceType,
43    pub ras: Vec<String>,
44    pub group_by: GroupBy,
45    pub report_tz: TimeZone,
46    pub report_commodity: Option<Arc<Commodity>>,
47    pub price_lookup: PriceLookup,
48    pub scale: Scale,
49}
50
51impl TryFrom<&Settings> for BalanceGroupSettings {
52    type Error = tackler::Error;
53
54    fn try_from(settings: &Settings) -> Result<Self, Self::Error> {
55        let bgs = BalanceGroupSettings {
56            title: settings.report.balance_group.title.clone(),
57            bal_type: settings.report.balance_group.bal_type.clone(),
58            ras: settings.get_balance_group_ras(),
59            group_by: settings.report.balance_group.group_by,
60            report_tz: settings.report.report_tz.clone(),
61            report_commodity: settings.get_report_commodity(),
62            price_lookup: settings.get_price_lookup(),
63            scale: settings.report.scale.clone(),
64        };
65        Ok(bgs)
66    }
67}
68
69impl From<BalanceGroupSettings> for BalanceSettings {
70    fn from(bgs: BalanceGroupSettings) -> BalanceSettings {
71        BalanceSettings {
72            title: String::default(),
73            bal_type: bgs.bal_type.clone(),
74            ras: bgs.ras.clone(),
75            scale: bgs.scale.clone(),
76            report_commodity: bgs.report_commodity.clone(),
77            price_lookup: bgs.price_lookup.clone(),
78        }
79    }
80}
81
82#[derive(Debug, Clone)]
83pub struct RegisterSettings {
84    pub title: String,
85    pub ras: Vec<String>,
86    pub report_tz: TimeZone,
87    pub report_commodity: Option<Arc<Commodity>>,
88    pub price_lookup: PriceLookup,
89    pub timestamp_style: TimestampStyle,
90    pub(crate) scale: Scale,
91}
92
93impl TryFrom<&Settings> for RegisterSettings {
94    type Error = tackler::Error;
95
96    fn try_from(settings: &Settings) -> Result<RegisterSettings, tackler::Error> {
97        let rs = RegisterSettings {
98            title: settings.report.register.title.clone(),
99            ras: settings.get_register_ras(),
100            report_tz: settings.report.report_tz.clone(),
101            report_commodity: settings.get_report_commodity(),
102            price_lookup: settings.get_price_lookup(),
103            timestamp_style: settings.report.register.timestamp_style,
104            scale: settings.report.scale.clone(),
105        };
106        Ok(rs)
107    }
108}