Skip to content

Commit 63104f3

Browse files
feat(dag-cbor): implement Encode/Decode for NonZero* (#192)
1 parent d321dcc commit 63104f3

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

dag-cbor/src/decode.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,33 @@ macro_rules! impl_num {
229229
impl_num!(unsigned u8, u16, u32, u64, u128);
230230
impl_num!(signed i8, i16, i32, i64, i128);
231231

232+
macro_rules! impl_nonzero {
233+
($(($nzero:ty => $base:ty))*) => {
234+
$(
235+
impl Decode<DagCbor> for $nzero {
236+
fn decode<R: Read + Seek>(c: DagCbor, r: &mut R) -> Result<Self> {
237+
let base = <$base>::decode(c, r)?;
238+
let nzero = <$nzero>::try_from(base)?;
239+
Ok(nzero)
240+
}
241+
}
242+
)*
243+
};
244+
}
245+
246+
impl_nonzero!(
247+
(std::num::NonZeroU8 => u8)
248+
(std::num::NonZeroU16 => u16)
249+
(std::num::NonZeroU32 => u32)
250+
(std::num::NonZeroU64 => u64)
251+
(std::num::NonZeroU128 => u128)
252+
(std::num::NonZeroI8 => i8)
253+
(std::num::NonZeroI16 => i16)
254+
(std::num::NonZeroI32 => i32)
255+
(std::num::NonZeroI64 => i64)
256+
(std::num::NonZeroI128 => i128)
257+
);
258+
232259
impl Decode<DagCbor> for f32 {
233260
fn decode<R: Read + Seek>(_: DagCbor, r: &mut R) -> Result<Self> {
234261
// TODO: We don't accept f16
@@ -571,6 +598,10 @@ mod tests {
571598
use super::*;
572599
use crate::{error::UnexpectedEof, DagCborCodec};
573600
use libipld_core::codec::Codec;
601+
use std::num::{
602+
NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroU128, NonZeroU16,
603+
NonZeroU32, NonZeroU64, NonZeroU8,
604+
};
574605

575606
#[test]
576607
fn il_map() {
@@ -632,4 +663,54 @@ mod tests {
632663

633664
Ok(())
634665
}
666+
667+
#[test]
668+
fn nonzero_int() -> Result<()> {
669+
let bytes = DagCborCodec.encode(&42i128)?;
670+
let n: NonZeroI8 = DagCborCodec.decode(&bytes)?;
671+
assert_eq!(n.get(), 42);
672+
673+
let bytes = DagCborCodec.encode(&-43i64)?;
674+
let n: NonZeroI16 = DagCborCodec.decode(&bytes)?;
675+
assert_eq!(n.get(), -43);
676+
677+
let bytes = DagCborCodec.encode(&44i32)?;
678+
let n: NonZeroI32 = DagCborCodec.decode(&bytes)?;
679+
assert_eq!(n.get(), 44);
680+
681+
let bytes = DagCborCodec.encode(&-45i16)?;
682+
let n: NonZeroI64 = DagCborCodec.decode(&bytes)?;
683+
assert_eq!(n.get(), -45);
684+
685+
let bytes = DagCborCodec.encode(&46i8)?;
686+
let n: NonZeroI128 = DagCborCodec.decode(&bytes)?;
687+
assert_eq!(n.get(), 46);
688+
689+
Ok(())
690+
}
691+
692+
#[test]
693+
fn nonzero_uint() -> Result<()> {
694+
let bytes = DagCborCodec.encode(&42i128)?;
695+
let n: NonZeroU8 = DagCborCodec.decode(&bytes)?;
696+
assert_eq!(n.get(), 42);
697+
698+
let bytes = DagCborCodec.encode(&43u64)?;
699+
let n: NonZeroU16 = DagCborCodec.decode(&bytes)?;
700+
assert_eq!(n.get(), 43);
701+
702+
let bytes = DagCborCodec.encode(&44u32)?;
703+
let n: NonZeroU32 = DagCborCodec.decode(&bytes)?;
704+
assert_eq!(n.get(), 44);
705+
706+
let bytes = DagCborCodec.encode(&45u16)?;
707+
let n: NonZeroU64 = DagCborCodec.decode(&bytes)?;
708+
assert_eq!(n.get(), 45);
709+
710+
let bytes = DagCborCodec.encode(&46u8)?;
711+
let n: NonZeroU128 = DagCborCodec.decode(&bytes)?;
712+
assert_eq!(n.get(), 46);
713+
714+
Ok(())
715+
}
635716
}

dag-cbor/src/encode.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,30 @@ impl Encode<DagCbor> for i64 {
149149
}
150150
}
151151

152+
macro_rules! impl_nonzero {
153+
($($t:ty),*) => {
154+
$(
155+
impl Encode<DagCbor> for $t {
156+
fn encode<W: Write>(&self, c: DagCbor, w: &mut W) -> Result<()> {
157+
self.get().encode(c, w)
158+
}
159+
}
160+
)*
161+
};
162+
}
163+
164+
impl_nonzero!(
165+
std::num::NonZeroU8,
166+
std::num::NonZeroU16,
167+
std::num::NonZeroU32,
168+
std::num::NonZeroU64,
169+
std::num::NonZeroI8,
170+
std::num::NonZeroI16,
171+
std::num::NonZeroI32,
172+
std::num::NonZeroI64,
173+
std::num::NonZeroI128
174+
);
175+
152176
impl Encode<DagCbor> for f32 {
153177
fn encode<W: Write>(&self, c: DagCbor, w: &mut W) -> Result<()> {
154178
// IPLD maximally encodes floats.

0 commit comments

Comments
 (0)