logisheets_controller/calc_engine/calculator/funcs/
cumipmt.rs1use super::{CalcValue, CalcVertex, Value};
2use crate::calc_engine::calculator::math::cumipmt::calc_cumipmt;
3use crate::calc_engine::connector::Connector;
4use logisheets_parser::ast;
5
6pub fn cumipmt<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
7where
8 C: Connector,
9{
10 assert_or_return!(args.len() == 6, ast::Error::Unspecified);
11 let mut args_iter = args.into_iter();
12 let rate_arg = fetcher.get_calc_value(args_iter.next().unwrap());
13 assert_f64_from_calc_value!(rate, rate_arg);
14 let nper_arg = fetcher.get_calc_value(args_iter.next().unwrap());
15 assert_f64_from_calc_value!(nper, nper_arg);
16 let pv_arg = fetcher.get_calc_value(args_iter.next().unwrap());
17 assert_f64_from_calc_value!(pv, pv_arg);
18 let start_arg = fetcher.get_calc_value(args_iter.next().unwrap());
19 assert_f64_from_calc_value!(start, start_arg);
20 let end_arg = fetcher.get_calc_value(args_iter.next().unwrap());
21 assert_f64_from_calc_value!(end, end_arg);
22 let ty_arg = fetcher.get_calc_value(args_iter.next().unwrap());
23 assert_f64_from_calc_value!(ty, ty_arg);
24 assert_or_return!(ty == 0. || ty == 1., ast::Error::Num);
25
26 let res = calc_cumipmt(
27 rate,
28 nper.floor() as usize,
29 pv,
30 start.floor() as i64,
31 end.floor() as i64,
32 ty == 1.,
33 );
34 match res {
35 Some(r) => CalcVertex::from_number(r),
36 None => CalcVertex::from_error(ast::Error::Num),
37 }
38}