use super::{
adcode_or_jwd_to_weather::WeatherResponse,
adds_jwd_type::AddressResponse,
ip_to_info_type::IpLocationResponse,
jwd_adds_type::AddressReference,
jwd_to_qmap::{CoordinateResponse, JwdType},
};
use crate::{all::mapqq::ReverseGeocodeResponse, json, url};
use reqwest::Client;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct JwdToAdds {
pub jd: f64, pub wd: f64, }
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AddsToJwd {
pub address: String,
}
#[derive(Debug, Serialize, Default, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum WeatherQueryType {
#[serde(alias = "now")]
#[default]
Now,
#[serde(alias = "future")]
Future,
}
#[derive(Serialize, Deserialize, Default, Debug, Clone)]
pub struct TMap {
#[serde(default)]
pub key: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(flatten, default)] pub jwd: Option<JwdToAdds>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(flatten, default)] pub adds: Option<AddsToJwd>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(flatten, default)]
pub ip: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub adcode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub r#type: Option<String>,
}
impl TMap {
pub async fn jwd_to_adds(&self) -> ReverseGeocodeResponse {
let url = format!(
"https://apis.map.qq.com/ws/geocoder/v1/?location={},{}&key={}",
&self.jwd.clone().unwrap().wd,
&self.jwd.clone().unwrap().jd,
&self.key
);
let response = Client::new().get(url).send().await.unwrap();
if !response.status().is_success() {
panic!("请求失败,状态码: {}", response.status());
}
response
.json::<ReverseGeocodeResponse>()
.await
.map_err(|e| {
println!("解析数据 ReverseGeocodeResponse 失败: {:#?}", &self);
println!("解析 经纬度 数据 ReverseGeocodeResponse 失败: {}", e);
})
.unwrap()
}
pub async fn adds_to_jwd(&self) -> AddressResponse {
let url = format!(
"https://apis.map.qq.com/ws/geocoder/v1/?address={}&key={}",
url::encode(&self.adds.clone().unwrap().address),
&self.key
);
let response = Client::new().get(url).send().await.unwrap();
if !response.status().is_success() {
panic!("请求失败,状态码: {}", response.status());
}
response
.json::<AddressResponse>()
.await
.map_err(|e| {
println!("解析数据 AddressResponse 失败: {:#?}", &self);
println!("解析数据 AddressResponse 失败: {}", e);
})
.unwrap()
}
pub async fn adcode_or_jwd_to_weather(&self) -> WeatherResponse {
let mut url = format!(
"https://apis.map.qq.com/ws/weather/v1/?key={}&output=json",
self.key
);
if let Some(adcode) = &self.adcode {
url.push_str(&format!("&adcode={}", adcode));
}
if let Some(query_type) = &self.r#type {
url.push_str(&format!("&type={}", query_type));
}
if let Some(coord) = &self.jwd {
url.push_str(&format!("&location={},{}", coord.wd, coord.jd));
}
let res = Client::new().get(url).send().await.unwrap();
if res.status().is_success() {
res.json::<WeatherResponse>()
.await
.map_err(|e| {
println!("解析 天气 数据 WeatherResponse 失败: {:#?}", &self);
println!("解析 天气 数据 WeatherResponse 失败: {}", e);
})
.unwrap()
} else {
panic!("请求失败,状态码: {}", res.status());
}
}
pub async fn ip_to_info(&self) -> IpLocationResponse {
let url = format!(
" https://apis.map.qq.com/ws/location/v1/ip?ip={}&key={}",
&self.ip.clone().unwrap(),
&self.key
);
let response = Client::new().get(url).send().await.unwrap();
if !response.status().is_success() {
panic!("请求失败,状态码: {}", response.status());
}
response
.json::<IpLocationResponse>()
.await
.map_err(|e| {
println!("解析数据 IpLocationResponse 失败: {:#?}", &self);
println!("解析数据 IpLocationResponse 失败: {}", e);
})
.unwrap()
}
pub async fn jwd_to_qmap(&self, e: Vec<JwdType>) -> CoordinateResponse {
let first_type = e[0].coord_type;
let locations = e
.iter()
.map(|c| format!("{},{}", c.latitude, c.longitude))
.collect::<Vec<_>>()
.join(";");
let url = format!(
"https://apis.map.qq.com/ws/coord/v1/translate?key={}&locations={}&type={}&output=json",
&self.key, locations, first_type as i32
);
let response = Client::new().get(url).send().await.unwrap();
if !response.status().is_success() {
panic!("请求失败,状态码: {}", response.status());
}
response
.json::<CoordinateResponse>()
.await
.map_err(|e| {
println!("解析数据 CoordinateResponse 失败: {:#?}", &self);
println!("解析数据 CoordinateResponse 失败: {}", e);
})
.unwrap()
}
}