use anda_core::Json;
use candid::Principal;
use chrono::prelude::*;
use rand::RngExt;
pub mod context;
pub mod engine;
pub mod extension;
pub mod hook;
pub mod management;
pub mod memory;
pub mod model;
pub mod store;
pub use structured_logger::unix_ms;
pub use ic_cose::rand_bytes;
pub const ANONYMOUS: Principal = Principal::anonymous();
pub static APP_USER_AGENT: &str = concat!(
"Mozilla/5.0 anda.bot ",
env!("CARGO_PKG_NAME"),
"/",
env!("CARGO_PKG_VERSION"),
);
pub fn rand_number<T, R>(range: R) -> T
where
T: rand::distr::uniform::SampleUniform,
R: rand::distr::uniform::SampleRange<T>,
{
let mut rng = rand::rng();
rng.random_range(range)
}
pub fn rfc3339_datetime_now() -> String {
Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true)
}
pub fn rfc3339_datetime(now_ms: u64) -> Option<String> {
let datetime = DateTime::<Utc>::from_timestamp_millis(now_ms as i64);
datetime.map(|dt| dt.to_rfc3339_opts(chrono::SecondsFormat::Millis, true))
}
pub fn json_set_unix_ms_timestamp(mut vals: Vec<Json>, timestamp_ms: u64) -> Vec<Json> {
for val in vals.iter_mut() {
if let Some(obj) = val.as_object_mut() {
obj.insert("timestamp".into(), timestamp_ms.into());
}
}
vals
}
pub fn json_convert_rfc3339_timestamp(mut vals: Vec<Json>) -> Vec<Json> {
for val in vals.iter_mut() {
if let Some(obj) = val.as_object_mut()
&& let Some(timestamp_ms) = obj.get("timestamp").and_then(Json::as_u64)
{
obj.insert("timestamp".into(), rfc3339_datetime(timestamp_ms).into());
}
}
vals
}