Shared Rust kernels
ported/cumulative_finance_family
All modules · quoted at commit 9e1884369a67 of DnaCalc/DnaCalc. Comments are the source's own.
validate_finite · 9 lines · calc-func/src/ported/cumulative_finance_family.rs on GitHubfn validate_finite(values: &[f64]) -> Result<(), CumulativeFinanceEvalError> {
if values.iter().all(|value| value.is_finite()) {
Ok(())
} else {
Err(CumulativeFinanceEvalError::Domain(
WorksheetErrorCode::Value,
))
}
}
Used by 2 functions.
trunc_positive_period · 12 lines · calc-func/src/ported/cumulative_finance_family.rs on GitHubfn trunc_positive_period(value: f64) -> Result<i32, CumulativeFinanceEvalError> {
if !value.is_finite() {
return Err(CumulativeFinanceEvalError::Domain(
WorksheetErrorCode::Value,
));
}
let truncated = value.trunc();
if truncated < 1.0 || truncated > i32::MAX as f64 {
return Err(CumulativeFinanceEvalError::Domain(WorksheetErrorCode::Num));
}
Ok(truncated as i32)
}
Used by 2 functions.
payment_timing_arg · 10 lines · calc-func/src/ported/cumulative_finance_family.rs on GitHubfn payment_timing_arg(value: f64) -> Result<PaymentTiming, CumulativeFinanceEvalError> {
validate_finite(&[value])?;
if (value - 0.0).abs() < EPSILON {
Ok(PaymentTiming::EndOfPeriod)
} else if (value - 1.0).abs() < EPSILON {
Ok(PaymentTiming::BeginningOfPeriod)
} else {
Err(CumulativeFinanceEvalError::Domain(WorksheetErrorCode::Num))
}
}
Used by 2 functions.
kernel_error · 7 lines · calc-func/src/ported/cumulative_finance_family.rs on GitHubfn kernel_error(error: FinancialError) -> CumulativeFinanceEvalError {
CumulativeFinanceEvalError::Domain(match error {
FinancialError::Num | FinancialError::NoConvergence => WorksheetErrorCode::Num,
FinancialError::Div0 => WorksheetErrorCode::Div0,
FinancialError::Value => WorksheetErrorCode::Value,
})
}
Used by 2 functions.
principal_sum · 16 lines · calc-func/src/ported/cumulative_finance_family.rs on GitHub/// The principal repaid over `start..=end`: PPMT summed left to right.
fn principal_sum(
rate: f64,
periods: i32,
pv: f64,
start_period: i32,
end_period: i32,
timing: PaymentTiming,
) -> Result<f64, CumulativeFinanceEvalError> {
let mut total = 0.0;
for period in start_period..=end_period {
total += time_value::ppmt(rate, period as f64, periods as f64, pv, 0.0, timing)
.map_err(kernel_error)?;
}
Ok(total)
}
Used by 2 functions.
validate_cumulative_inputs · 18 lines · calc-func/src/ported/cumulative_finance_family.rs on GitHubfn validate_cumulative_inputs(
rate: f64,
periods: i32,
pv: f64,
start_period: i32,
end_period: i32,
timing: PaymentTiming,
) -> Result<(), CumulativeFinanceEvalError> {
let _ = timing;
validate_finite(&[rate, pv])?;
if rate <= 0.0 || periods < 1 || pv <= 0.0 {
return Err(CumulativeFinanceEvalError::Domain(WorksheetErrorCode::Num));
}
if start_period < 1 || end_period < 1 || start_period > end_period || end_period > periods {
return Err(CumulativeFinanceEvalError::Domain(WorksheetErrorCode::Num));
}
Ok(())
}
Used by 2 functions.
map_cumulative_finance_error_to_ws · 8 lines · calc-func/src/ported/cumulative_finance_family.rs on GitHubpub fn map_cumulative_finance_error_to_ws(
error: &CumulativeFinanceEvalError,
) -> WorksheetErrorCode {
match error {
CumulativeFinanceEvalError::ArityMismatch { .. } => WorksheetErrorCode::Value,
CumulativeFinanceEvalError::Domain(code) => *code,
}
}
Used by 2 functions.