logisheets_controller/calc_engine/calculator/funcs/bonds/
couppcd.rs1use crate::calc_engine::calculator::math::bond::coupncd;
2use logisheets_parser::ast;
3
4use super::super::{CalcValue, CalcVertex, Value};
5use crate::calc_engine::connector::Connector;
6
7pub fn calc<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
8where
9 C: Connector,
10{
11 assert_or_return!(args.len() >= 3 && args.len() <= 4, ast::Error::Unspecified);
12 let mut args_iter = args.into_iter();
13 let first = fetcher.get_calc_value(args_iter.next().unwrap());
14 assert_f64_from_calc_value!(settle_num, first);
15 assert_or_return!(settle_num > 0., ast::Error::Value);
16
17 let second = fetcher.get_calc_value(args_iter.next().unwrap());
18 assert_f64_from_calc_value!(maturity_num, second);
19 assert_or_return!(maturity_num > 0., ast::Error::Value);
20
21 let third = fetcher.get_calc_value(args_iter.next().unwrap());
22 assert_f64_from_calc_value!(freq_num, third);
23 assert_or_return!(
24 freq_num == 1. || freq_num == 2. || freq_num == 4.,
25 ast::Error::Num
26 );
27
28 let fourth = fetcher.get_calc_value(args_iter.next().unwrap());
29 assert_f64_from_calc_value!(base, fourth);
30 assert_or_return!(base >= 0. && base <= 4., ast::Error::Num);
31
32 assert_or_return!(settle_num < maturity_num, ast::Error::Num);
33
34 let result = coupncd(
35 settle_num.floor() as u32,
36 maturity_num.floor() as u32,
37 base.floor() as u8,
38 ) as f64;
39 CalcVertex::from_number(result)
40}