279 lines
7.6 KiB
Rust
279 lines
7.6 KiB
Rust
use crate::shared::models::UserSession;
|
|
use crate::shared::state::AppState;
|
|
use chrono::{Datelike, Local, Timelike, Utc};
|
|
use log::debug;
|
|
use rhai::{Dynamic, Engine, Map};
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn create_datetime_map(local: chrono::DateTime<Local>) -> Map {
|
|
let mut map = Map::new();
|
|
|
|
|
|
map.insert("year".into(), Dynamic::from(local.year() as i64));
|
|
map.insert("month".into(), Dynamic::from(local.month() as i64));
|
|
map.insert("day".into(), Dynamic::from(local.day() as i64));
|
|
|
|
|
|
map.insert("hour".into(), Dynamic::from(local.hour() as i64));
|
|
map.insert("minute".into(), Dynamic::from(local.minute() as i64));
|
|
map.insert("second".into(), Dynamic::from(local.second() as i64));
|
|
|
|
|
|
map.insert(
|
|
"weekday".into(),
|
|
Dynamic::from(local.weekday().num_days_from_sunday() as i64 + 1),
|
|
);
|
|
|
|
|
|
let weekday_name = match local.weekday().num_days_from_sunday() {
|
|
0 => "Sunday",
|
|
1 => "Monday",
|
|
2 => "Tuesday",
|
|
3 => "Wednesday",
|
|
4 => "Thursday",
|
|
5 => "Friday",
|
|
6 => "Saturday",
|
|
_ => "Unknown",
|
|
};
|
|
map.insert(
|
|
"weekday_name".into(),
|
|
Dynamic::from(weekday_name.to_string()),
|
|
);
|
|
|
|
|
|
let month_name = match local.month() {
|
|
1 => "January",
|
|
2 => "February",
|
|
3 => "March",
|
|
4 => "April",
|
|
5 => "May",
|
|
6 => "June",
|
|
7 => "July",
|
|
8 => "August",
|
|
9 => "September",
|
|
10 => "October",
|
|
11 => "November",
|
|
12 => "December",
|
|
_ => "Unknown",
|
|
};
|
|
map.insert("month_name".into(), Dynamic::from(month_name.to_string()));
|
|
|
|
|
|
map.insert("timestamp".into(), Dynamic::from(local.timestamp()));
|
|
|
|
|
|
map.insert(
|
|
"formatted".into(),
|
|
Dynamic::from(local.format("%Y-%m-%d %H:%M:%S").to_string()),
|
|
);
|
|
map.insert(
|
|
"date".into(),
|
|
Dynamic::from(local.format("%Y-%m-%d").to_string()),
|
|
);
|
|
map.insert(
|
|
"time".into(),
|
|
Dynamic::from(local.format("%H:%M:%S").to_string()),
|
|
);
|
|
map.insert(
|
|
"iso".into(),
|
|
Dynamic::from(local.format("%Y-%m-%dT%H:%M:%S%z").to_string()),
|
|
);
|
|
|
|
|
|
let quarter = ((local.month() - 1) / 3) + 1;
|
|
map.insert("quarter".into(), Dynamic::from(quarter as i64));
|
|
|
|
|
|
map.insert("day_of_year".into(), Dynamic::from(local.ordinal() as i64));
|
|
|
|
|
|
let is_weekend =
|
|
local.weekday().num_days_from_sunday() == 0 || local.weekday().num_days_from_sunday() == 6;
|
|
map.insert("is_weekend".into(), Dynamic::from(is_weekend));
|
|
|
|
|
|
let is_pm = local.hour() >= 12;
|
|
map.insert("is_pm".into(), Dynamic::from(is_pm));
|
|
map.insert(
|
|
"ampm".into(),
|
|
Dynamic::from(if is_pm { "PM" } else { "AM" }.to_string()),
|
|
);
|
|
|
|
|
|
let hour12 = if local.hour() == 0 {
|
|
12
|
|
} else if local.hour() > 12 {
|
|
local.hour() - 12
|
|
} else {
|
|
local.hour()
|
|
};
|
|
map.insert("hour12".into(), Dynamic::from(hour12 as i64));
|
|
|
|
map
|
|
}
|
|
|
|
pub fn now_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
|
|
|
|
|
|
|
|
engine.register_fn("NOW", || -> Map { create_datetime_map(Local::now()) });
|
|
|
|
engine.register_fn("now", || -> Map { create_datetime_map(Local::now()) });
|
|
|
|
|
|
engine.register_fn("NOW_UTC", || -> Map {
|
|
let utc = Utc::now();
|
|
let local = utc.with_timezone(&Local);
|
|
create_datetime_map(local)
|
|
});
|
|
|
|
|
|
engine.register_fn("NOW_STR", || -> String {
|
|
Local::now().format("%Y-%m-%d %H:%M:%S").to_string()
|
|
});
|
|
|
|
engine.register_fn("now_str", || -> String {
|
|
Local::now().format("%Y-%m-%d %H:%M:%S").to_string()
|
|
});
|
|
|
|
debug!("Registered NOW keyword with .property access");
|
|
}
|
|
|
|
pub fn today_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
|
|
|
|
|
|
|
|
engine.register_fn("TODAY", || -> Map {
|
|
let now = Local::now();
|
|
let mut map = Map::new();
|
|
|
|
map.insert("year".into(), Dynamic::from(now.year() as i64));
|
|
map.insert("month".into(), Dynamic::from(now.month() as i64));
|
|
map.insert("day".into(), Dynamic::from(now.day() as i64));
|
|
map.insert(
|
|
"weekday".into(),
|
|
Dynamic::from(now.weekday().num_days_from_sunday() as i64 + 1),
|
|
);
|
|
map.insert(
|
|
"formatted".into(),
|
|
Dynamic::from(now.format("%Y-%m-%d").to_string()),
|
|
);
|
|
map.insert("day_of_year".into(), Dynamic::from(now.ordinal() as i64));
|
|
|
|
let is_weekend =
|
|
now.weekday().num_days_from_sunday() == 0 || now.weekday().num_days_from_sunday() == 6;
|
|
map.insert("is_weekend".into(), Dynamic::from(is_weekend));
|
|
|
|
let quarter = ((now.month() - 1) / 3) + 1;
|
|
map.insert("quarter".into(), Dynamic::from(quarter as i64));
|
|
|
|
map
|
|
});
|
|
|
|
engine.register_fn("today", || -> Map {
|
|
let now = Local::now();
|
|
let mut map = Map::new();
|
|
|
|
map.insert("year".into(), Dynamic::from(now.year() as i64));
|
|
map.insert("month".into(), Dynamic::from(now.month() as i64));
|
|
map.insert("day".into(), Dynamic::from(now.day() as i64));
|
|
map.insert(
|
|
"weekday".into(),
|
|
Dynamic::from(now.weekday().num_days_from_sunday() as i64 + 1),
|
|
);
|
|
map.insert(
|
|
"formatted".into(),
|
|
Dynamic::from(now.format("%Y-%m-%d").to_string()),
|
|
);
|
|
|
|
map
|
|
});
|
|
|
|
|
|
engine.register_fn("TODAY_STR", || -> String {
|
|
Local::now().format("%Y-%m-%d").to_string()
|
|
});
|
|
|
|
engine.register_fn("today_str", || -> String {
|
|
Local::now().format("%Y-%m-%d").to_string()
|
|
});
|
|
|
|
debug!("Registered TODAY keyword with .property access");
|
|
}
|
|
|
|
pub fn time_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
|
|
|
|
|
|
|
|
engine.register_fn("TIME", || -> Map {
|
|
let now = Local::now();
|
|
let mut map = Map::new();
|
|
|
|
map.insert("hour".into(), Dynamic::from(now.hour() as i64));
|
|
map.insert("minute".into(), Dynamic::from(now.minute() as i64));
|
|
map.insert("second".into(), Dynamic::from(now.second() as i64));
|
|
map.insert(
|
|
"formatted".into(),
|
|
Dynamic::from(now.format("%H:%M:%S").to_string()),
|
|
);
|
|
|
|
let is_pm = now.hour() >= 12;
|
|
map.insert("is_pm".into(), Dynamic::from(is_pm));
|
|
map.insert(
|
|
"ampm".into(),
|
|
Dynamic::from(if is_pm { "PM" } else { "AM" }.to_string()),
|
|
);
|
|
|
|
let hour12 = if now.hour() == 0 {
|
|
12
|
|
} else if now.hour() > 12 {
|
|
now.hour() - 12
|
|
} else {
|
|
now.hour()
|
|
};
|
|
map.insert("hour12".into(), Dynamic::from(hour12 as i64));
|
|
|
|
map
|
|
});
|
|
|
|
engine.register_fn("time", || -> Map {
|
|
let now = Local::now();
|
|
let mut map = Map::new();
|
|
|
|
map.insert("hour".into(), Dynamic::from(now.hour() as i64));
|
|
map.insert("minute".into(), Dynamic::from(now.minute() as i64));
|
|
map.insert("second".into(), Dynamic::from(now.second() as i64));
|
|
map.insert(
|
|
"formatted".into(),
|
|
Dynamic::from(now.format("%H:%M:%S").to_string()),
|
|
);
|
|
|
|
map
|
|
});
|
|
|
|
|
|
engine.register_fn("TIME_STR", || -> String {
|
|
Local::now().format("%H:%M:%S").to_string()
|
|
});
|
|
|
|
|
|
engine.register_fn("TIMESTAMP", || -> i64 { Utc::now().timestamp() });
|
|
|
|
engine.register_fn("timestamp", || -> i64 { Utc::now().timestamp() });
|
|
|
|
debug!("Registered TIME keyword with .property access");
|
|
}
|
|
|
|
pub fn timestamp_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
|
|
|
|
engine.register_fn("UNIX_TIMESTAMP", || -> i64 { Utc::now().timestamp() });
|
|
|
|
engine.register_fn("TIMESTAMP_MS", || -> i64 { Utc::now().timestamp_millis() });
|
|
|
|
debug!("Registered TIMESTAMP keyword");
|
|
}
|