use serde::{Serialize, de::DeserializeOwned};
use super::Client;
use crate::{
error::{Error, Result},
requests::general::{CallVendorRequest, CallVendorRequestInternal, Request},
responses::general as responses,
};
pub struct General<'a> {
pub(super) client: &'a Client,
}
impl General<'_> {
#[doc(alias = "GetVersion")]
pub async fn version(&self) -> Result<responses::Version> {
self.client.send_message(Request::Version).await
}
#[doc(alias = "GetStats")]
pub async fn stats(&self) -> Result<responses::Stats> {
self.client.send_message(Request::Stats).await
}
#[doc(alias = "BroadcastCustomEvent")]
pub async fn broadcast_custom_event<T>(&self, event_data: &T) -> Result<()>
where
T: Serialize,
{
let event_data =
serde_json::to_value(event_data).map_err(crate::error::SerializeCustomDataError)?;
if !event_data.is_object() {
return Err(Error::InvalidCustomData);
}
self.client
.send_message(Request::BroadcastCustomEvent { event_data })
.await
}
#[doc(alias = "CallVendorRequest")]
pub async fn call_vendor_request<T, R>(
&self,
request: CallVendorRequest<'_, T>,
) -> Result<responses::VendorResponse<R>>
where
T: Serialize,
R: DeserializeOwned,
{
self.client
.send_message(Request::CallVendorRequest(CallVendorRequestInternal {
vendor_name: request.vendor_name,
request_type: request.request_type,
request_data: serde_json::to_value(request.request_data)
.map_err(crate::error::SerializeCustomDataError)?,
}))
.await
}
}