use codec::{Compact, Decode, Encode};
use core::marker::PhantomData;
pub trait PalletError: Encode + Decode {
const MAX_ENCODED_SIZE: usize;
}
macro_rules! impl_for_types {
(size: $size:expr, $($typ:ty),+) => {
$(
impl PalletError for $typ {
const MAX_ENCODED_SIZE: usize = $size;
}
)+
};
}
impl_for_types!(size: 0, (), crate::Never);
impl_for_types!(size: 1, u8, i8, bool);
impl_for_types!(size: 2, u16, i16, Compact<u8>);
impl_for_types!(size: 4, u32, i32, Compact<u16>);
impl_for_types!(size: 5, Compact<u32>);
impl_for_types!(size: 8, u64, i64);
impl_for_types!(size: 9, Compact<u64>);
impl_for_types!(size: 12, core::time::Duration);
impl_for_types!(size: 16, u128, i128);
impl_for_types!(size: 17, Compact<u128>);
impl<T> PalletError for PhantomData<T> {
const MAX_ENCODED_SIZE: usize = 0;
}
impl<T: PalletError> PalletError for core::ops::Range<T> {
const MAX_ENCODED_SIZE: usize = T::MAX_ENCODED_SIZE.saturating_mul(2);
}
impl<T: PalletError, const N: usize> PalletError for [T; N] {
const MAX_ENCODED_SIZE: usize = T::MAX_ENCODED_SIZE.saturating_mul(N);
}
impl<T: PalletError> PalletError for Option<T> {
const MAX_ENCODED_SIZE: usize = T::MAX_ENCODED_SIZE.saturating_add(1);
}
impl<T: PalletError, E: PalletError> PalletError for Result<T, E> {
const MAX_ENCODED_SIZE: usize = if T::MAX_ENCODED_SIZE > E::MAX_ENCODED_SIZE {
T::MAX_ENCODED_SIZE
} else {
E::MAX_ENCODED_SIZE
}
.saturating_add(1);
}
#[impl_trait_for_tuples::impl_for_tuples(1, 18)]
impl PalletError for Tuple {
const MAX_ENCODED_SIZE: usize = {
let mut size = 0_usize;
for_tuples!( #(size = size.saturating_add(Tuple::MAX_ENCODED_SIZE);)* );
size
};
}