cardano_serialization_lib/serialization/numeric/
int.rs

1use crate::*;
2use crate::serialization::utils::read_nint;
3
4impl cbor_event::se::Serialize for Int {
5    fn serialize<'se, W: Write>(
6        &self,
7        serializer: &'se mut Serializer<W>,
8    ) -> cbor_event::Result<&'se mut Serializer<W>> {
9        if self.0 < 0 {
10            serializer.write_negative_integer(self.0 as i64)
11        } else {
12            serializer.write_unsigned_integer(self.0 as u64)
13        }
14    }
15}
16
17impl Deserialize for Int {
18    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
19        (|| -> Result<_, DeserializeError> {
20            match raw.cbor_type()? {
21                cbor_event::Type::UnsignedInteger => Ok(Self(raw.unsigned_integer()? as i128)),
22                cbor_event::Type::NegativeInteger => Ok(Self(read_nint(raw)?)),
23                _ => Err(DeserializeFailure::NoVariantMatched.into()),
24            }
25        })()
26            .map_err(|e| e.annotate("Int"))
27    }
28}