use crate::{
is_compressed, Usage,
ArkScale,ArkScaleRef,
MaxEncodedLen,
scale::{self, Decode, Encode, EncodeLike, Input, Output}, };
use ark_serialize::{CanonicalSerialize,CanonicalDeserialize,Compress,Validate};
pub trait ArkScaleMaxEncodedLen {
fn max_encoded_len(compress: Compress) -> usize;
}
impl ArkScaleMaxEncodedLen for () {
#[inline]
fn max_encoded_len(_: Compress) -> usize { 0 }
}
impl<T, const U: Usage> MaxEncodedLen for ArkScale<T, U>
where T: CanonicalSerialize+ArkScaleMaxEncodedLen,
{
#[inline]
fn max_encoded_len() -> usize {
<T as ArkScaleMaxEncodedLen>::max_encoded_len(is_compressed(U))
}
}
impl<'a, T, const U: Usage> MaxEncodedLen for ArkScaleRef<'a, T, U>
where T: CanonicalSerialize+ArkScaleMaxEncodedLen,
{
#[inline]
fn max_encoded_len() -> usize {
<T as ArkScaleMaxEncodedLen>::max_encoded_len(is_compressed(U))
}
}
#[derive(Clone, Eq, PartialEq, Debug)] #[repr(transparent)]
pub struct ArkScaleLen<T, const L: usize>(pub T);
impl<T, const L: usize> From<T> for ArkScaleLen<T,L> {
fn from(t: T) -> ArkScaleLen<T,L> {
ArkScaleLen(t)
}
}
impl<T: CanonicalDeserialize, const L: usize> Decode for ArkScaleLen<T, L> {
fn decode<I: Input>(input: &mut I) -> Result<Self, scale::Error> {
<T as CanonicalDeserialize>::deserialize_with_mode(
crate::InputAsRead(input),
Compress::Yes,
Validate::Yes,
)
.map(|v| ArkScaleLen(v))
.map_err(crate::ark_error_to_scale_error)
}
}
impl<T: CanonicalSerialize, const L: usize> EncodeLike for ArkScaleLen<T, L> {}
impl<T: CanonicalSerialize, const L: usize> Encode for ArkScaleLen<T, L> {
fn size_hint(&self) -> usize {
self.encoded_size()
}
fn encode_to<O: Output + ?Sized>(&self, dest: &mut O) {
self.0
.serialize_with_mode(crate::OutputAsWrite(dest), Compress::Yes)
.expect(crate::OOPS);
}
fn encoded_size(&self) -> usize {
let l = self.0.serialized_size(Compress::Yes);
debug_assert!(l <= L, "ArkScaleLen has incorrect length specified.");
l
}
}
impl<T: CanonicalDeserialize, const L: usize> ArkScaleMaxEncodedLen for ArkScaleLen<T, L> {
fn max_encoded_len(_: Compress) -> usize { L }
}