rscel 1.0.8

Cel interpreter in rust
Documentation
use crate::macros::dispatch;

pub use methods::dispatch as set_milliseconds;

#[dispatch]
mod methods {
    use chrono::{DateTime, Timelike, Utc};

    use crate::{
        context::default_funcs::time_funcs::helpers::get_adjusted_datetime, CelError, CelResult,
        CelValue,
    };

    fn set_milliseconds(this: DateTime<Utc>, millisecond: i64) -> CelResult<DateTime<Utc>> {
        let millisecond = u32::try_from(millisecond)
            .map_err(|_| CelError::argument("setMilliseconds() millisecond out of range"))?;
        if millisecond > 999 {
            return Err(CelError::argument(
                "setMilliseconds() millisecond out of range",
            ));
        }
        let nanos = millisecond * 1_000_000;
        this.with_nanosecond(nanos)
            .ok_or_else(|| CelError::argument("setMilliseconds() millisecond out of range"))
    }

    fn set_milliseconds(this: DateTime<Utc>, millisecond: u64) -> CelResult<DateTime<Utc>> {
        let millisecond = u32::try_from(millisecond)
            .map_err(|_| CelError::argument("setMilliseconds() millisecond out of range"))?;
        if millisecond > 999 {
            return Err(CelError::argument(
                "setMilliseconds() millisecond out of range",
            ));
        }
        let nanos = millisecond * 1_000_000;
        this.with_nanosecond(nanos)
            .ok_or_else(|| CelError::argument("setMilliseconds() millisecond out of range"))
    }

    fn set_milliseconds(
        this: DateTime<Utc>,
        millisecond: i64,
        timezone: String,
    ) -> CelResult<DateTime<Utc>> {
        let millisecond = u32::try_from(millisecond)
            .map_err(|_| CelError::argument("setMilliseconds() millisecond out of range"))?;
        if millisecond > 999 {
            return Err(CelError::argument(
                "setMilliseconds() millisecond out of range",
            ));
        }
        let nanos = millisecond * 1_000_000;
        let adjusted = get_adjusted_datetime(this, timezone)?;
        let updated = adjusted
            .with_nanosecond(nanos)
            .ok_or_else(|| CelError::argument("setMilliseconds() millisecond out of range"))?;
        Ok(updated.with_timezone(&Utc))
    }

    fn set_milliseconds(
        this: DateTime<Utc>,
        millisecond: u64,
        timezone: String,
    ) -> CelResult<DateTime<Utc>> {
        let millisecond = u32::try_from(millisecond)
            .map_err(|_| CelError::argument("setMilliseconds() millisecond out of range"))?;
        if millisecond > 999 {
            return Err(CelError::argument(
                "setMilliseconds() millisecond out of range",
            ));
        }
        let nanos = millisecond * 1_000_000;
        let adjusted = get_adjusted_datetime(this, timezone)?;
        let updated = adjusted
            .with_nanosecond(nanos)
            .ok_or_else(|| CelError::argument("setMilliseconds() millisecond out of range"))?;
        Ok(updated.with_timezone(&Utc))
    }
}