logisheets_controller/calc_engine/calculator/funcs/bonds/
couppcd.rs

1use 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}