use serde::{Deserialize, Serialize, Serializer};
use std::borrow::Cow;
use thiserror::Error;
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CheckpointVerificationResponse {
pub checkpoint: VerificationState,
pub signature: VerificationState,
#[serde(skip_serializing_if = "Option::is_none")]
pub retry_after: Option<u16>,
}
#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum VerificationState {
#[serde(rename_all = "camelCase")]
Unverified,
#[serde(rename_all = "camelCase")]
Verified,
#[serde(rename_all = "camelCase")]
Invalid,
}
#[non_exhaustive]
#[derive(Debug, Error)]
pub enum MonitorError {
#[error("{message}")]
Message {
status: u16,
message: String,
},
}
impl MonitorError {
pub fn status(&self) -> u16 {
match self {
Self::Message { status, .. } => *status,
}
}
}
#[derive(Serialize, Deserialize)]
#[serde(untagged, rename_all = "camelCase")]
enum RawError<'a> {
Message { status: u16, message: Cow<'a, str> },
}
impl Serialize for MonitorError {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Message { status, message } => RawError::Message {
status: *status,
message: Cow::Borrowed(message),
}
.serialize(serializer),
}
}
}
impl<'de> Deserialize<'de> for MonitorError {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
match RawError::deserialize(deserializer)? {
RawError::Message { status, message } => Ok(Self::Message {
status,
message: message.into_owned(),
}),
}
}
}