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) => {
// Check for () -> Transactions
let step = lookup_fn(args.clone());
let step = lookup_fn(name, args.clone(), context);
if step.requires(context).len() == 0 {
return true;
}
@ -287,7 +287,7 @@ impl GenerateBalances {
}
HasStepOrCanBuild::CanLookup(lookup_fn) => {
// Check for () -> Transactions
let step = lookup_fn(args.clone());
let step = lookup_fn(name, args.clone(), context);
if step.requires(context).len() == 0 {
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))
{
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);
}
}
@ -133,7 +133,7 @@ fn build_step_for_product(
panic!("Attempted to call build_step_for_product for already existing step")
}
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
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>()
}
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 {
args: *args.downcast().unwrap(),
})
@ -143,18 +151,22 @@ impl AllTransactionsExceptEarningsToEquityBalances {
"AllTransactionsExceptEarningsToEquity".to_string(),
vec![ReportingProductKind::BalancesAt],
Self::takes_args,
|a| Self::from_args(ReportingProductKind::BalancesAt, a),
|_name, args, _ctx| Self::from_args(ReportingProductKind::BalancesAt, args),
);
context.register_lookup_fn(
"AllTransactionsExceptEarningsToEquity".to_string(),
vec![ReportingProductKind::BalancesBetween],
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
}
@ -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>()
}
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 {
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>()
}
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 {
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>()
}
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 {
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>()
}
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 {
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>()
}
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 {
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>()
}
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 {
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>()
}
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 {})
}
}
@ -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>()
}
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 {
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>()
}
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 {})
}
}
@ -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>()
}
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 {
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>()
}
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 {
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]
///
/// 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]
///
/// 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