logisheets_controller 0.6.0

the core of LogiSheets
Documentation
use crate::calc_engine::calculator::calc_vertex::Reference;
use crate::calc_engine::connector::Connector;

use super::CalcVertex;

use logisheets_parser::ast;

pub fn calc_row<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
where
    C: Connector,
{
    assert_or_return!(args.len() <= 1, ast::Error::Unspecified);
    match args.into_iter().next() {
        Some(value) => match value {
            CalcVertex::Value(_) => CalcVertex::from_error(ast::Error::Unspecified),
            CalcVertex::Reference(reference) => match reference.reference {
                Reference::Addr(a) => CalcVertex::from_number(a.row as f64 + 1.),
                Reference::ColumnRange(_) => CalcVertex::from_number(1.),
                Reference::RowRange(rr) => CalcVertex::from_number(rr.start as f64 + 1.),
                Reference::Range(s, _) => CalcVertex::from_number(s.row as f64 + 1.),
            },
            CalcVertex::Union(_) => CalcVertex::from_error(ast::Error::Unspecified),
        },
        None => CalcVertex::from_number(fetcher.get_curr_addr().row as f64 + 1_f64),
    }
}

pub fn calc_rows<C>(args: Vec<CalcVertex>, _: &mut C) -> CalcVertex
where
    C: Connector,
{
    assert_or_return!(args.len() == 1, ast::Error::Unspecified);
    let arg = args.into_iter().next().unwrap();
    match arg {
        CalcVertex::Value(_) => CalcVertex::from_number(1.),
        CalcVertex::Reference(reference) => match reference.reference {
            Reference::Addr(_) => CalcVertex::from_number(1.),
            Reference::ColumnRange(_) => CalcVertex::from_number(1048576.),
            Reference::RowRange(rr) => CalcVertex::from_number((rr.end - rr.start + 1) as f64),
            Reference::Range(s, e) => CalcVertex::from_number((e.row - s.row + 1) as f64),
        },
        CalcVertex::Union(_) => CalcVertex::from_error(ast::Error::Unspecified),
    }
}

pub fn calc_column<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
where
    C: Connector,
{
    assert_or_return!(args.len() <= 1, ast::Error::Unspecified);
    match args.into_iter().next() {
        Some(value) => match value {
            CalcVertex::Value(_) => CalcVertex::from_error(ast::Error::Unspecified),
            CalcVertex::Reference(reference) => match reference.reference {
                Reference::Addr(a) => CalcVertex::from_number(a.col as f64 + 1.),
                Reference::ColumnRange(cr) => CalcVertex::from_number(cr.start as f64 + 1.),
                Reference::RowRange(_) => CalcVertex::from_number(1.),
                Reference::Range(s, _) => CalcVertex::from_number(s.col as f64 + 1.),
            },
            CalcVertex::Union(_) => CalcVertex::from_error(ast::Error::Unspecified),
        },
        None => CalcVertex::from_number(fetcher.get_curr_addr().col as f64 + 1_f64),
    }
}

pub fn calc_columns<C>(args: Vec<CalcVertex>, _: &mut C) -> CalcVertex
where
    C: Connector,
{
    assert_or_return!(args.len() == 1, ast::Error::Unspecified);
    let arg = args.into_iter().next().unwrap();
    match arg {
        CalcVertex::Value(_) => CalcVertex::from_number(1.),
        CalcVertex::Reference(reference) => match reference.reference {
            Reference::Addr(_) => CalcVertex::from_number(1.),
            Reference::ColumnRange(cr) => CalcVertex::from_number((cr.end - cr.start + 1) as f64),
            Reference::RowRange(_) => CalcVertex::from_number(16384.),
            Reference::Range(s, e) => CalcVertex::from_number((e.col - s.col + 1) as f64),
        },
        CalcVertex::Union(_) => CalcVertex::from_error(ast::Error::Unspecified),
    }
}