use crate::{map, prelude2::*};
use chrono::{DateTime, Offset, TimeZone, Utc};
use std::collections::HashMap;
pub async fn map_of(request: HttpRequest) -> impl Responder {
let ctx = map!(
"id",
123,
"name",
"Alice",
"active",
true,
"info",
map!(
"email",
"alice@example.com",
"age",
28,
"address",
map!("city", "Shanghai", "zip", "200000")
),
"tags",
vec!["vip", "beta_user"]
);
request.json(200, R::ok(ctx))
}
pub async fn to_datetime_string(
query: web::Form<HashMap<String, String>>,
request: HttpRequest,
) -> impl Responder {
let timestamp_value_str = query
.get("timestamp_value")
.ok_or_else(|| Error::invalid_request("Missing form data field: timestamp_value"))?;
let datetime_zone = query
.get("datetime_zone2")
.ok_or_else(|| Error::invalid_request("Missing form data field: datetime_zone2"))?;
let timestamp_value = crate::commons::string_to_number::<i64>(timestamp_value_str)?;
let naive = DateTime::from_timestamp_millis(timestamp_value).unwrap();
let tz: chrono_tz::Tz = datetime_zone.parse().unwrap();
let offset = tz.offset_from_utc_datetime(&Utc::now().naive_utc());
let offset_count: i32 = offset.fix().local_minus_utc() / 3600;
let datetime_tz: DateTime<chrono_tz::Tz> = tz.from_utc_datetime(&naive.naive_utc());
let date_string: String = datetime_tz.format("%Y-%m-%dT%H:%M:%S.%3fZ").to_string();
let datetime_string_rfc3339 = if date_string.ends_with('Z') && offset_count != 0 {
let s = &date_string.replace('Z', "");
if offset_count > 0 {
format!("{}+{:02}:00", s, offset_count)
} else {
format!("{}-{:02}:00", s, offset_count.abs())
}
} else {
date_string.to_string()
};
request.json(200, R::ok(datetime_string_rfc3339))
}
pub async fn parse_datetime_string_to_millis(
query: web::Form<HashMap<String, String>>,
request: HttpRequest,
) -> impl Responder {
let datetime_string = query
.get("datetime_string")
.ok_or_else(|| Error::invalid_request("Missing form data field: datetime_string"))?;
let datetime_string = if datetime_string.ends_with('Z') {
format!("{}+00:00", datetime_string.replace('Z', ""))
} else {
datetime_string.to_string()
};
let local_time = chrono::DateTime::parse_from_rfc3339(&datetime_string).unwrap();
let naive_date_time = local_time.with_timezone(&Utc).naive_local();
let datetime_utc = DateTime::<Utc>::from_naive_utc_and_offset(naive_date_time, Utc);
let timestamp_millis: i64 = datetime_utc.timestamp_millis();
request.json(200, R::ok(timestamp_millis))
}
pub async fn convert_to_unicode_escape(data: web::Bytes, request: HttpRequest) -> impl Responder {
let data = crate::commons::bytes_to_string(data.to_vec())?;
let s = lazy_regex::regex_replace_all!(r#"\\u([0-9a-zA-Z]{4})"#, &data, |_, num: &str| {
let num: u32 = u32::from_str_radix(num, 16).unwrap();
let c: char = std::char::from_u32(num).unwrap();
c.to_string()
});
request.text(200, s.as_ref())
}
pub async fn format_jsonstring(data: web::Bytes, request: HttpRequest) -> impl Responder {
let data = crate::commons::bytes_to_string(data.to_vec())?;
let result = formatjson::format_json(&data).map_err(|e| anyhow::anyhow!(e))?;
request.text(200, &result)
}