#[macro_export]
macro_rules! kson {
($var:ident) => {
let mut $var = serde_json::json!({});
};
($var:ident $( [ $key:expr ] )+ = $value:expr ) => {{
let mut temp = &mut $var;
$(
let key = $key;
temp = {
if let Some(index) = key.to_string().parse::<usize>().ok() {
if !temp.is_array() {
*temp = serde_json::json!([]);
}
let arr = temp.as_array_mut().unwrap();
if arr.len() <= index {
arr.resize(index + 1, serde_json::Value::Null);
}
&mut arr[index]
} else {
let key_str = key.to_string();
if !temp.is_object() {
*temp = serde_json::json!({});
}
temp.as_object_mut().unwrap()
.entry(key_str)
.or_insert_with(|| serde_json::Value::Null)
}
};
)*
*temp = serde_json::json!($value);
}};
($var:ident $( [ $key:expr ] )+ : &str) => {{
let mut temp = &$var;
$(
let key = $key;
temp = {
if let Some(index) = key.to_string().parse::<usize>().ok() {
if let Some(arr) = temp.as_array() {
arr.get(index).unwrap_or(&serde_json::Value::Null)
} else {
&serde_json::Value::Null
}
} else {
if let Some(obj) = temp.as_object() {
obj.get(&key.to_string()).unwrap_or(&serde_json::Value::Null)
} else {
&serde_json::Value::Null
}
}
};
)*
if let Some(str_value) = temp.as_str() {
str_value
} else if let Some(num_value) = temp.as_i64() {
Box::leak(Box::new(num_value.to_string()))
} else if let Some(num_value) = temp.as_f64() {
Box::leak(Box::new(num_value.to_string()))
} else {
panic!("Cannot convert to type '&str'.")
}
}};
($var:ident $( [ $key:expr ] ) + : $t:ty) => {{
let mut temp = &$var;
$(
let key = $key;
temp = {
if let Some(index) = key.to_string().parse::<usize>().ok() {
if let Some(arr) = temp.as_array() {
arr.get(index).unwrap_or(&serde_json::Value::Null)
} else {
&serde_json::Value::Null
}
} else {
if let Some(obj) = temp.as_object() {
obj.get(&key.to_string()).unwrap_or(&serde_json::Value::Null)
} else {
&serde_json::Value::Null
}
}
};
)*
serde_json::from_value::<$t>(temp.clone()).unwrap_or_else(|_| {
if let Some(str_value) = temp.as_str() {
if let Ok(parsed_value) = str_value.parse::<$t>() {
parsed_value
} else {
panic!("Failed to convert the value to type '{}'.", stringify!($t))
}
} else if let Some(num_value) = temp.as_f64() {
if stringify!($t) == "String" || stringify!($t) == "&str" {
num_value.to_string().parse::<$t>().unwrap()
} else {
panic!("Failed to convert the value to type '{}'.", stringify!($t))
}
} else {
panic!("Failed to convert the value to type '{}'.", stringify!($t))
}
})
}};
}
use rand::Rng;
pub fn kson_rand(min: i64, max: i64) -> i64 {
let mut rng = rand::thread_rng();
rng.gen_range(min..=max)
}
use std::thread;
use std::time::Duration;
pub fn kson_sleep(seconds: f64) {
let duration = Duration::from_secs_f64(seconds);
thread::sleep(duration);
}
use std::time::{SystemTime, UNIX_EPOCH};
pub fn kson_time() -> u64 {
let start = SystemTime::now();
start
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_secs()
}
pub fn kson_microtime() -> u64 {
let start = SystemTime::now();
start
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_micros() as u64
}
pub fn kson_number_format<T: ToString>(num: T, decimals: usize) -> String {
let formatted = format!("{:.*}", decimals, num.to_string().parse::<f64>().unwrap());
let parts: Vec<&str> = formatted.split('.').collect();
let int_part = parts[0]
.chars()
.rev()
.collect::<Vec<_>>()
.chunks(3)
.map(|chunk| chunk.iter().collect::<String>())
.collect::<Vec<_>>()
.join(",")
.chars()
.rev()
.collect::<String>();
if parts.len() > 1 {
format!("{}.{}", int_part, parts[1])
} else {
int_part
}
}
use chrono::{Local, TimeZone, Utc};
pub fn kson_datetime(unix_time: u64) -> String {
let datetime = if unix_time > 1_000_000_000_000 {
let secs = (unix_time / 1_000_000) as i64;
let nanos = ((unix_time % 1_000_000) as u32) * 1_000;
Utc.timestamp_opt(secs, nanos).unwrap()
} else {
Utc.timestamp_opt(unix_time as i64, 0).unwrap()
};
let local_time = datetime.with_timezone(&Local);
local_time.format("%Y-%m-%d %H:%M:%S").to_string()
}
pub fn kson() {
let blue = "\x1b[34m";
let reset = "\x1b[0m";
println!("{}============================{}", blue, reset);
println!("{}kson function list{}", blue, reset);
println!("{}============================{}", blue, reset);
println!("{}kson_rand(1,100);{}", blue, reset);
println!("{}kson_time();{}", blue, reset);
println!("{}kson_microtime();{}", blue, reset);
println!("{}kson_datetime(kson_time());{}", blue, reset);
println!("{}kson_number_format(123456789);{}", blue, reset);
println!("{}kson_sleep(3);{}", blue, reset);
println!("{}============================{}", blue, reset);
}