use alloc::string::String;
use serde::de::DeserializeOwned;
use serde_json::Value;
use serde_tuple::{Deserialize_tuple, Serialize_tuple};
use crate::errors::{Error, Result};
#[derive(Debug, PartialEq, Eq, Serialize_tuple, Deserialize_tuple, Clone)]
pub struct CallResultRaw {
pub(super) message_id: i32,
pub unique_id: String,
pub payload: Value,
}
impl CallResultRaw {
#[must_use]
pub const fn new(unique_id: String, payload: Value) -> Self {
Self {
message_id: 3,
unique_id,
payload,
}
}
pub fn into_typed<T: DeserializeOwned>(self) -> Result<CallResult<T>> {
let payload = serde_json::from_value(self.payload).map_err(Error::SerdeJson)?;
Ok(CallResult {
message_id: 3,
unique_id: self.unique_id,
payload,
})
}
#[must_use]
pub fn probe_candidates(
&self,
) -> alloc::vec::Vec<crate::v21::typed_call_result::TypedCallResult> {
crate::v21::typed_call_result::TypedCallResult::probe_from_raw(self)
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct CallResult<T> {
pub(super) message_id: i32,
pub unique_id: String,
pub payload: T,
}
impl<T> CallResult<T> {
#[must_use]
pub const fn new(unique_id: String, payload: T) -> Self {
Self {
message_id: 3,
unique_id,
payload,
}
}
}
pub fn deserialize_call_result<T: DeserializeOwned>(data: &str) -> Result<CallResult<T>> {
let raw: CallResultRaw = serde_json::from_str(data).map_err(Error::SerdeJson)?;
if raw.message_id != 3 {
return Err(Error::InvalidMessageCallType);
}
raw.into_typed()
}