use serde::{Serialize, Serializer, ser::Error as _};
use serde_json::Value;
#[derive(Debug)]
pub(crate) struct TaskPayload<'a, T: ?Sized> {
pub(crate) task_type: &'a str,
pub(crate) params: &'a T,
}
impl<T> Serialize for TaskPayload<'_, T>
where
T: Serialize + ?Sized,
{
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
let value = serde_json::to_value(self.params).map_err(S::Error::custom)?;
let Value::Object(mut params) = value else {
return Err(S::Error::custom(
"task parameters must serialize as an object",
));
};
params.insert("type".to_owned(), Value::String(self.task_type.to_owned()));
params.serialize(serializer)
}
}
#[derive(Debug, Serialize)]
pub(crate) struct CreateTaskRequest<'a, T: ?Sized> {
#[serde(rename = "clientKey")]
pub(crate) client_key: &'a str,
#[serde(rename = "appId", skip_serializing_if = "Option::is_none")]
pub(crate) app_id: Option<i32>,
pub(crate) task: TaskPayload<'a, T>,
}
#[derive(Debug, Serialize)]
pub(crate) struct QueryTaskResultRequest<'a> {
#[serde(rename = "clientKey")]
pub(crate) client_key: &'a str,
#[serde(rename = "taskId")]
pub(crate) task_id: &'a str,
}
#[derive(Debug, Serialize)]
pub(crate) struct QueryBalanceRequest<'a> {
#[serde(rename = "clientKey")]
pub(crate) client_key: &'a str,
}