elrond_codec/impl_for_types/
impl_non_zero_usize.rs1use 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}