1use crate::codec::{CodecError, Decoder, Encoder};
14use crate::types::{AnyTerm, Env, Integer};
15
16macro_rules! narrow_signed {
19 ($($t:ty),+ $(,)?) => { $(
20 impl<'id> Encoder<'id> for $t {
22 fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
23 Integer::from_i64(env, i64::from(*self)).encode(env)
24 }
25 }
26
27 impl<'id> Decoder<'id> for $t {
30 fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
31 let val = Integer::decode(term, env)?.to_i64(env).ok_or(CodecError::IntegerOverflow)?;
32 Self::try_from(val).map_err(|_| CodecError::IntegerOverflow)
33 }
34 }
35 )+ };
36}
37
38macro_rules! narrow_unsigned {
39 ($($t:ty),+ $(,)?) => { $(
40 impl<'id> Encoder<'id> for $t {
42 fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
43 Integer::from_u64(env, u64::from(*self)).encode(env)
44 }
45 }
46
47 impl<'id> Decoder<'id> for $t {
51 fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
52 let val = Integer::decode(term, env)?.to_u64(env).ok_or(CodecError::IntegerOverflow)?;
53 Self::try_from(val).map_err(|_| CodecError::IntegerOverflow)
54 }
55 }
56 )+ };
57}
58
59narrow_signed!(i8, i16, i32);
60narrow_unsigned!(u8, u16, u32);
61
62impl<'id> Encoder<'id> for i64 {
66 fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
67 Integer::from_i64(env, *self).encode(env)
68 }
69}
70
71impl<'id> Decoder<'id> for i64 {
74 fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
75 Integer::decode(term, env)?.to_i64(env).ok_or(CodecError::IntegerOverflow)
76 }
77}
78
79impl<'id> Encoder<'id> for u64 {
81 fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
82 Integer::from_u64(env, *self).encode(env)
83 }
84}
85
86impl<'id> Decoder<'id> for u64 {
90 fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
91 Integer::decode(term, env)?.to_u64(env).ok_or(CodecError::IntegerOverflow)
92 }
93}
94
95impl<'id> Encoder<'id> for isize {
100 fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
101 Integer::from_i64(env, *self as i64).encode(env)
102 }
103}
104
105impl<'id> Decoder<'id> for isize {
108 fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
109 let val = Integer::decode(term, env)?.to_i64(env).ok_or(CodecError::IntegerOverflow)?;
110 Self::try_from(val).map_err(|_| CodecError::IntegerOverflow)
111 }
112}
113
114impl<'id> Encoder<'id> for usize {
116 fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
117 Integer::from_u64(env, *self as u64).encode(env)
118 }
119}
120
121impl<'id> Decoder<'id> for usize {
125 fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
126 let val = Integer::decode(term, env)?.to_u64(env).ok_or(CodecError::IntegerOverflow)?;
127 Self::try_from(val).map_err(|_| CodecError::IntegerOverflow)
128 }
129}