Skip to main content

akar_function/scalar/
interval.rs

1use crate::registry::*;
2use akar_common::types::{Interval, Value};
3
4// ==================== Interval constructor functions ====================
5
6/// Evaluate an interval constructor function.
7/// Each takes a single INT64 argument and returns an INTERVAL value.
8pub(crate) fn evaluate_interval(op: IntervalOp, args: &[Value]) -> Result<Value, String> {
9    let n = match &args[0] {
10        Value::Int64(x) => *x,
11        _ => return Err("Interval functions require integer argument".into()),
12    };
13    let interval = match op {
14        IntervalOp::ToYears => Interval::new((n * 12) as i32, 0, 0),
15        IntervalOp::ToMonths => Interval::new(n as i32, 0, 0),
16        IntervalOp::ToDays => Interval::new(0, n as i32, 0),
17        IntervalOp::ToHours => Interval::new(0, 0, n * 3_600_000_000),
18        IntervalOp::ToMinutes => Interval::new(0, 0, n * 60_000_000),
19        IntervalOp::ToSeconds => Interval::new(0, 0, n * 1_000_000),
20        IntervalOp::ToMilliseconds => Interval::new(0, 0, n * 1000),
21        IntervalOp::ToMicroseconds => Interval::new(0, 0, n),
22    };
23    Ok(Value::Interval(interval))
24}