use serde::{Deserialize, Serialize};
use crate::error::{DinkError, Result};
#[derive(Debug, Deserialize)]
pub struct PlatformResponse<T> {
pub success: bool,
pub data: Option<T>,
pub error: Option<ErrorInfo>,
}
#[derive(Debug, Deserialize)]
pub struct ServiceResponse<T> {
pub success: Option<bool>,
pub result: Option<T>,
pub error: Option<ErrorInfo>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ErrorInfo {
pub code: String,
pub message: String,
}
#[derive(Debug, Serialize)]
pub struct StreamRequest<T: Serialize> {
pub reply_subject: String,
pub data: T,
}
#[derive(Debug, Deserialize)]
pub struct StreamAck {
pub status: Option<String>,
#[serde(rename = "cancelSubject")]
pub cancel_subject: Option<String>,
}
pub fn parse_platform_response<T: serde::de::DeserializeOwned>(data: &[u8]) -> Result<T> {
let resp: PlatformResponse<T> = serde_json::from_slice(data)?;
if resp.success {
resp.data
.ok_or_else(|| DinkError::Nats("empty response data".into()))
} else {
let err = resp.error.unwrap_or(ErrorInfo {
code: "UNKNOWN".into(),
message: "unknown error".into(),
});
Err(DinkError::Service {
service: String::new(),
method: String::new(),
code: err.code,
message: err.message,
})
}
}
pub fn parse_service_response<T: serde::de::DeserializeOwned>(data: &[u8]) -> Result<T> {
let resp: ServiceResponse<T> = serde_json::from_slice(data)?;
if let Some(false) = resp.success {
let err = resp.error.unwrap_or(ErrorInfo {
code: "UNKNOWN".into(),
message: "unknown error".into(),
});
return Err(DinkError::Service {
service: String::new(),
method: String::new(),
code: err.code,
message: err.message,
});
}
if let Some(result) = resp.result {
return Ok(result);
}
serde_json::from_slice(data).map_err(Into::into)
}