elrond_codec/impl_for_types/
impl_non_zero_usize.rs

1use core::num::NonZeroUsize;
2
3use crate::{
4    DecodeError, DecodeErrorHandler, EncodeErrorHandler, NestedDecode, NestedDecodeInput,
5    NestedEncode, NestedEncodeOutput, TopDecode, TopDecodeInput, TopEncode, TopEncodeOutput,
6};
7
8impl TopEncode for NonZeroUsize {
9    fn top_encode_or_handle_err<O, H>(&self, output: O, h: H) -> Result<(), H::HandledErr>
10    where
11        O: TopEncodeOutput,
12        H: EncodeErrorHandler,
13    {
14        self.get().top_encode_or_handle_err(output, h)
15    }
16}
17
18impl TopDecode for NonZeroUsize {
19    fn top_decode_or_handle_err<I, H>(input: I, h: H) -> Result<Self, H::HandledErr>
20    where
21        I: TopDecodeInput,
22        H: DecodeErrorHandler,
23    {
24        if let Some(nz) = NonZeroUsize::new(usize::top_decode_or_handle_err(input, h)?) {
25            Ok(nz)
26        } else {
27            Err(h.handle_error(DecodeError::INVALID_VALUE))
28        }
29    }
30}
31
32impl NestedEncode for NonZeroUsize {
33    #[inline]
34    fn dep_encode_or_handle_err<O, H>(&self, dest: &mut O, h: H) -> Result<(), H::HandledErr>
35    where
36        O: NestedEncodeOutput,
37        H: EncodeErrorHandler,
38    {
39        self.get().dep_encode_or_handle_err(dest, h)
40    }
41}
42
43impl NestedDecode for NonZeroUsize {
44    fn dep_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
45    where
46        I: NestedDecodeInput,
47        H: DecodeErrorHandler,
48    {
49        if let Some(nz) = NonZeroUsize::new(usize::dep_decode_or_handle_err(input, h)?) {
50            Ok(nz)
51        } else {
52            Err(h.handle_error(DecodeError::INVALID_VALUE))
53        }
54    }
55}
56
57#[cfg(test)]
58pub mod tests {
59    use crate::test_util::{check_dep_encode_decode, check_top_encode_decode};
60    use core::num::NonZeroUsize;
61
62    #[test]
63    fn test_top() {
64        check_top_encode_decode(NonZeroUsize::new(5).unwrap(), &[5]);
65    }
66
67    #[test]
68    fn test_dep() {
69        check_dep_encode_decode(NonZeroUsize::new(5).unwrap(), &[0, 0, 0, 5]);
70    }
71}