use super::bigint::BigInt;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde_with::{DeserializeAs, SerializeAs, serde_as};
use std::marker::PhantomData;
pub struct Readable<H, R> {
human_readable: PhantomData<H>,
non_human_readable: PhantomData<R>,
}
impl<T: ?Sized, H, R> SerializeAs<T> for Readable<H, R>
where
H: SerializeAs<T>,
R: SerializeAs<T>,
{
fn serialize_as<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
if serializer.is_human_readable() {
H::serialize_as(value, serializer)
} else {
R::serialize_as(value, serializer)
}
}
}
impl<'de, R, H, T> DeserializeAs<'de, T> for Readable<H, R>
where
H: DeserializeAs<'de, T>,
R: DeserializeAs<'de, T>,
{
fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
{
if deserializer.is_human_readable() {
H::deserialize_as(deserializer)
} else {
R::deserialize_as(deserializer)
}
}
}
#[serde_as]
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Copy)]
pub struct SequenceNumber(u64);
impl SerializeAs<super::types::SequenceNumber> for SequenceNumber {
fn serialize_as<S>(value: &super::types::SequenceNumber, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = value.value().to_string();
s.serialize(serializer)
}
}
impl<'de> DeserializeAs<'de, super::types::SequenceNumber> for SequenceNumber {
fn deserialize_as<D>(deserializer: D) -> Result<super::types::SequenceNumber, D::Error>
where
D: Deserializer<'de>,
{
let b = BigInt::deserialize(deserializer)?;
Ok(super::types::SequenceNumber::from_u64(*b))
}
}