Pass step name and context to reporting step

Preparation for plugins
This commit is contained in:
RunasSudo 2025-06-01 00:53:45 +10:00
parent d147f1a569
commit c422b53f16
Signed by: RunasSudo
GPG Key ID: 7234E476BF21C61A
4 changed files with 138 additions and 33 deletions

View File

@ -260,7 +260,7 @@ impl GenerateBalances {
} }
HasStepOrCanBuild::CanLookup(lookup_fn) => { HasStepOrCanBuild::CanLookup(lookup_fn) => {
// Check for () -> Transactions // Check for () -> Transactions
let step = lookup_fn(args.clone()); let step = lookup_fn(name, args.clone(), context);
if step.requires(context).len() == 0 { if step.requires(context).len() == 0 {
return true; return true;
} }
@ -287,7 +287,7 @@ impl GenerateBalances {
} }
HasStepOrCanBuild::CanLookup(lookup_fn) => { HasStepOrCanBuild::CanLookup(lookup_fn) => {
// Check for () -> Transactions // Check for () -> Transactions
let step = lookup_fn(args.clone()); let step = lookup_fn(name, args.clone(), context);
if step.requires(context).len() == 0 { if step.requires(context).len() == 0 {
return true; return true;
} }

View File

@ -96,7 +96,7 @@ pub fn has_step_or_can_build<'a, 'b>(
.find(|(name, kinds)| *name == product.name && kinds.contains(&product.kind)) .find(|(name, kinds)| *name == product.name && kinds.contains(&product.kind))
{ {
let (takes_args_fn, from_args_fn) = context.step_lookup_fn.get(lookup_key).unwrap(); let (takes_args_fn, from_args_fn) = context.step_lookup_fn.get(lookup_key).unwrap();
if takes_args_fn(&product.args) { if takes_args_fn(&product.name, &product.args, context) {
return HasStepOrCanBuild::CanLookup(*from_args_fn); return HasStepOrCanBuild::CanLookup(*from_args_fn);
} }
} }
@ -133,7 +133,7 @@ fn build_step_for_product(
panic!("Attempted to call build_step_for_product for already existing step") panic!("Attempted to call build_step_for_product for already existing step")
} }
HasStepOrCanBuild::CanLookup(from_args_fn) => { HasStepOrCanBuild::CanLookup(from_args_fn) => {
new_step = from_args_fn(product.args.clone()); new_step = from_args_fn(&product.name, product.args.clone(), context);
// Check new step meets the dependency // Check new step meets the dependency
if new_step.id().name != product.name { if new_step.id().name != product.name {

View File

@ -79,11 +79,19 @@ impl AllTransactionsExceptEarningsToEquity {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(AllTransactionsExceptEarningsToEquity { Box::new(AllTransactionsExceptEarningsToEquity {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -143,18 +151,22 @@ impl AllTransactionsExceptEarningsToEquityBalances {
"AllTransactionsExceptEarningsToEquity".to_string(), "AllTransactionsExceptEarningsToEquity".to_string(),
vec![ReportingProductKind::BalancesAt], vec![ReportingProductKind::BalancesAt],
Self::takes_args, Self::takes_args,
|a| Self::from_args(ReportingProductKind::BalancesAt, a), |_name, args, _ctx| Self::from_args(ReportingProductKind::BalancesAt, args),
); );
context.register_lookup_fn( context.register_lookup_fn(
"AllTransactionsExceptEarningsToEquity".to_string(), "AllTransactionsExceptEarningsToEquity".to_string(),
vec![ReportingProductKind::BalancesBetween], vec![ReportingProductKind::BalancesBetween],
Self::takes_args, Self::takes_args,
|a| Self::from_args(ReportingProductKind::BalancesBetween, a), |_name, args, _ctx| Self::from_args(ReportingProductKind::BalancesBetween, args),
); );
} }
fn takes_args(_args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
_args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
true true
} }
@ -249,11 +261,19 @@ impl AllTransactionsIncludingEarningsToEquity {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(AllTransactionsIncludingEarningsToEquity { Box::new(AllTransactionsIncludingEarningsToEquity {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -381,11 +401,19 @@ impl BalanceSheet {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<MultipleDateArgs>() args.is::<MultipleDateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(BalanceSheet { Box::new(BalanceSheet {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -555,11 +583,19 @@ impl CombineOrdinaryTransactions {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(CombineOrdinaryTransactions { Box::new(CombineOrdinaryTransactions {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -628,11 +664,19 @@ impl CombineOrdinaryTransactionsBalances {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(CombineOrdinaryTransactionsBalances { Box::new(CombineOrdinaryTransactionsBalances {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -729,11 +773,19 @@ impl CurrentYearEarningsToEquity {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(CurrentYearEarningsToEquity { Box::new(CurrentYearEarningsToEquity {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -866,11 +918,19 @@ impl DBBalances {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(DBBalances { Box::new(DBBalances {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -933,11 +993,19 @@ impl DBTransactions {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<VoidArgs>() args.is::<VoidArgs>()
} }
fn from_args(_args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
_args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(DBTransactions {}) Box::new(DBTransactions {})
} }
} }
@ -1000,11 +1068,19 @@ impl IncomeStatement {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<MultipleDateStartDateEndArgs>() args.is::<MultipleDateStartDateEndArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(IncomeStatement { Box::new(IncomeStatement {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -1171,11 +1247,19 @@ impl PostUnreconciledStatementLines {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<VoidArgs>() args.is::<VoidArgs>()
} }
fn from_args(_args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
_args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(PostUnreconciledStatementLines {}) Box::new(PostUnreconciledStatementLines {})
} }
} }
@ -1278,11 +1362,19 @@ impl RetainedEarningsToEquity {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(RetainedEarningsToEquity { Box::new(RetainedEarningsToEquity {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })
@ -1418,11 +1510,19 @@ impl TrialBalance {
); );
} }
fn takes_args(args: &Box<dyn ReportingStepArgs>) -> bool { fn takes_args(
_name: &str,
args: &Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> bool {
args.is::<DateArgs>() args.is::<DateArgs>()
} }
fn from_args(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep> { fn from_args(
_name: &str,
args: Box<dyn ReportingStepArgs>,
_context: &ReportingContext,
) -> Box<dyn ReportingStep> {
Box::new(TrialBalance { Box::new(TrialBalance {
args: *args.downcast().unwrap(), args: *args.downcast().unwrap(),
}) })

View File

@ -102,12 +102,17 @@ impl ReportingContext {
/// Function which determines whether the [ReportingStepArgs] are valid arguments for a given [ReportingStep] /// Function which determines whether the [ReportingStepArgs] are valid arguments for a given [ReportingStep]
/// ///
/// See [ReportingContext::register_lookup_fn]. /// See [ReportingContext::register_lookup_fn].
pub type ReportingStepTakesArgsFn = fn(args: &Box<dyn ReportingStepArgs>) -> bool; pub type ReportingStepTakesArgsFn =
fn(name: &str, args: &Box<dyn ReportingStepArgs>, context: &ReportingContext) -> bool;
/// Function which builds a concrete [ReportingStep] from the given [ReportingStepArgs] /// Function which builds a concrete [ReportingStep] from the given [ReportingStepArgs]
/// ///
/// See [ReportingContext::register_lookup_fn]. /// See [ReportingContext::register_lookup_fn].
pub type ReportingStepFromArgsFn = fn(args: Box<dyn ReportingStepArgs>) -> Box<dyn ReportingStep>; pub type ReportingStepFromArgsFn = fn(
name: &str,
args: Box<dyn ReportingStepArgs>,
context: &ReportingContext,
) -> Box<dyn ReportingStep>;
// ------------------------------- // -------------------------------
// REPORTING STEP DYNAMIC BUILDERS // REPORTING STEP DYNAMIC BUILDERS