use rand::Rng;
pub fn k_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 k_sleep(seconds: f64) {
let duration = Duration::from_secs_f64(seconds);
thread::sleep(duration);
}
use std::time::{SystemTime, UNIX_EPOCH};
pub fn k_time() -> u64 {
let start = SystemTime::now();
start
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_secs()
}
pub fn k_microtime() -> u64 {
let start = SystemTime::now();
start
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_micros() as u64
}
pub fn k_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 k_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()
}
use std::time::Instant;
static mut START_TIME: Option<Instant> = None;
pub fn k_tic() {
unsafe {
START_TIME = Some(Instant::now());
}
}
pub fn k_toc() {
unsafe {
if let Some(start) = START_TIME {
let duration = start.elapsed();
println!("\nElapsed time: {:?}\n", duration);
} else {
println!("Error: k_tic() was not called.");
}
START_TIME = None; }
}
use reqwest::blocking;
use std::error::Error;
pub fn k_get_url(url: &str) -> std::result::Result<String, Box<dyn Error>> {
let response = blocking::get(url)?.text()?;
Ok(response)
}
use sha2::{Digest, Sha256};
pub fn k_sha256(input: String) -> String {
let mut hasher = Sha256::new();
hasher.update(input);
let result = hasher.finalize();
format!("{:x}", result)
}
use std::fs::File;
use std::io::{Read, Write};
pub fn k_write(file_name: &str, data: String) -> std::io::Result<()> {
let mut file = File::create(file_name)?;
file.write_all(data.as_bytes())?;
Ok(())
}
pub fn k_read(file_name: &str) -> std::io::Result<String> {
let mut file = File::open(file_name)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
#[macro_export]
macro_rules! kset {
($var:ident) => {
let mut $var = serde_json::json!({});
};
($var:ident = $value:expr) => {{
$var = serde_json::json!($value);
}};
($var:ident . $key:ident = $value:expr) => {{
if !$var.is_object() {
$var = serde_json::json!({});
}
$var[$key] = serde_json::json!($value);
}};
($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);
}};
}
#[macro_export]
macro_rules! kget {
($expr:expr => String) => {{
if let Some(s) = $expr.as_str() {
s.to_string()
} else if let Some(n) = $expr.as_i64() {
n.to_string()
} else if let Some(n) = $expr.as_f64() {
n.to_string()
} else if let Some(b) = $expr.as_bool() {
b.to_string()
} else {
panic!(concat!("Cannot convert ", stringify!($expr), " to String"))
}
}};
($expr:expr => i64) => {{
if let Some(n) = $expr.as_i64() {
n
} else if let Some(s) = $expr.as_str() {
s.parse::<i64>()
.expect(concat!("Cannot parse ", stringify!($expr), " as i64"))
} else {
panic!(concat!("Cannot convert ", stringify!($expr), " to i64"))
}
}};
($expr:expr => f64) => {{
if let Some(n) = $expr.as_f64() {
n
} else if let Some(n) = $expr.as_i64() {
n as f64
} else if let Some(s) = $expr.as_str() {
s.parse::<f64>()
.expect(concat!("Cannot parse ", stringify!($expr), " as f64"))
} else {
panic!(concat!("Cannot convert ", stringify!($expr), " to f64"))
}
}};
($expr:expr => bool) => {{
if let Some(b) = $expr.as_bool() {
b
} else if let Some(s) = $expr.as_str() {
s.parse::<bool>()
.expect(concat!("Cannot parse ", stringify!($expr), " as bool"))
} else {
panic!(concat!("Cannot convert ", stringify!($expr), " to bool"))
}
}};
($expr:expr => $type:ty) => {{
serde_json::from_value::<$type>($expr.clone())
.expect(concat!("Failed to convert value to ", stringify!($type)))
}};
}