use urlencoding::encode;
use crate::elong::error::ElongError;
pub struct ApiSignedRequest {
pub user: String,
pub method: String,
pub timestamp: String,
pub format: String,
pub data: String,
pub signature: String,
}
pub struct ApiRequestPayload {
pub version: f64,
pub local: String,
pub request: String,
}
impl ApiSignedRequest {
pub fn new(
user: String,
app_key: String,
app_secret: String,
method: String,
data: ApiRequestPayload,
) -> Self {
let data = data.to_json();
let format = "json".to_string();
let timestamp = chrono::Local::now().timestamp().to_string();
log::debug!("timestamp: {}", timestamp);
let data_app_key = format!("{}{}", data, app_key);
log::debug!("data_app_key: {}", data_app_key);
let data_app_key_sig = format!("{:x}", md5::compute(data_app_key));
log::debug!("data_app_key_signature: {}", data_app_key_sig);
let sig_str = format!("{}{}{}", timestamp, data_app_key_sig, app_secret);
log::debug!("sig_str: {}", sig_str);
let signature = format!("{:x}", md5::compute(sig_str));
log::debug!("signature: {}", signature);
ApiSignedRequest {
user,
method,
timestamp,
format,
data,
signature,
}
}
pub fn to_params(&self) -> String {
format!(
"timestamp={}&format={}&method={}&signature={}&user={}&data={}",
self.timestamp,
self.format,
self.method,
self.signature,
self.user,
encode(&self.data)
)
}
}
impl ApiRequestPayload {
pub fn to_json(&self) -> String {
format!(
r#"{{"Version":"{}","Local":"{}","Request":{}}}"#,
self.version, self.local, self.request
)
}
}
pub trait BaseRequest {
fn to_json(&self) -> Result<String, ElongError>;
}