tackler-core 0.9.0

Core components for Tackler accounting engine with native GIT SCM support
Documentation
/*
 * Tackler-NG 2025
 * SPDX-License-Identifier: Apache-2.0
 */
use crate::config::Scale;
use crate::kernel::Settings;
use crate::kernel::price_lookup::PriceLookup;
use crate::model::Commodity;
use crate::tackler;
use jiff::tz::TimeZone;
use std::sync::Arc;
use tackler_api::txn_ts::{GroupBy, TimestampStyle};

#[derive(Debug, Clone)]
pub struct BalanceSettings {
    pub(crate) title: String,
    pub(crate) ras: Vec<String>,
    pub(crate) scale: Scale,
    pub(crate) report_commodity: Option<Arc<Commodity>>,
    pub(crate) price_lookup: PriceLookup,
}

impl TryFrom<&Settings> for BalanceSettings {
    type Error = tackler::Error;

    fn try_from(settings: &Settings) -> Result<Self, Self::Error> {
        Ok(BalanceSettings {
            title: settings.report.balance.title.clone(),
            ras: settings.get_balance_ras(),
            scale: settings.report.scale.clone(),
            report_commodity: settings.get_report_commodity(),
            price_lookup: settings.get_price_lookup(),
        })
    }
}

#[derive(Debug, Clone)]
pub struct BalanceGroupSettings {
    pub title: String,
    pub ras: Vec<String>,
    pub group_by: GroupBy,
    pub report_tz: TimeZone,
    pub report_commodity: Option<Arc<Commodity>>,
    pub price_lookup: PriceLookup,
    pub scale: Scale,
}

impl TryFrom<&Settings> for BalanceGroupSettings {
    type Error = tackler::Error;

    fn try_from(settings: &Settings) -> Result<Self, Self::Error> {
        let bgs = BalanceGroupSettings {
            title: settings.report.balance_group.title.clone(),
            ras: settings.get_balance_group_ras(),
            group_by: settings.report.balance_group.group_by,
            report_tz: settings.report.report_tz.clone(),
            report_commodity: settings.get_report_commodity(),
            price_lookup: settings.get_price_lookup(),
            scale: settings.report.scale.clone(),
        };
        Ok(bgs)
    }
}

#[derive(Debug, Clone)]
pub struct RegisterSettings {
    pub title: String,
    pub ras: Vec<String>,
    pub report_tz: TimeZone,
    pub report_commodity: Option<Arc<Commodity>>,
    pub price_lookup: PriceLookup,
    pub timestamp_style: TimestampStyle,
    pub(crate) scale: Scale,
}

impl TryFrom<&Settings> for RegisterSettings {
    type Error = tackler::Error;

    fn try_from(settings: &Settings) -> Result<RegisterSettings, tackler::Error> {
        let rs = RegisterSettings {
            title: settings.report.register.title.clone(),
            ras: settings.get_register_ras(),
            report_tz: settings.report.report_tz.clone(),
            report_commodity: settings.get_report_commodity(),
            price_lookup: settings.get_price_lookup(),
            timestamp_style: settings.report.register.timestamp_style,
            scale: settings.report.scale.clone(),
        };
        Ok(rs)
    }
}