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 GitHub
fn 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 GitHub
fn 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 GitHub
fn 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 GitHub
fn 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 GitHub
fn 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 GitHub
pub fn map_cumulative_finance_error_to_ws(
    error: &CumulativeFinanceEvalError,
) -> WorksheetErrorCode {
    match error {
        CumulativeFinanceEvalError::ArityMismatch { .. } => WorksheetErrorCode::Value,
        CumulativeFinanceEvalError::Domain(code) => *code,
    }
}

Used by 2 functions.