msgpack/pack/
int.rs

1use super::primitive::*;
2use crate::{code, PackError};
3use std::io;
4
5const FIX_INT_MAX: i8 = -1;
6const INT8_MAX: i8 = -33;
7const INT16_MAX: i16 = -129;
8const INT32_MAX: i32 = -32769;
9const INT64_MAX: i64 = -2147483649; // -((1 << 31) + 1)
10
11pub fn pack_neg_fix_int<W: io::Write>(writer: &mut W, v: i8) -> Result<(), PackError> {
12    if v > INT8_MAX && v <= FIX_INT_MAX {
13        write_data_i8(writer, v)
14    } else {
15        use std::io::ErrorKind;
16        Err(PackError::WriteError(io::Error::new(
17            ErrorKind::Other,
18            format!("Value is out of range for negative fix int : {:?}", v),
19        )))
20    }
21}
22
23pub fn pack_i8<W: io::Write>(writer: &mut W, v: i8) -> Result<(), PackError> {
24    write_data_u8(writer, code::INT8)?;
25    write_data_i8(writer, v)
26}
27
28pub fn pack_i16<W: io::Write>(writer: &mut W, v: i16) -> Result<(), PackError> {
29    write_data_u8(writer, code::INT16)?;
30    write_data_i16(writer, v)
31}
32
33pub fn pack_i32<W: io::Write>(writer: &mut W, v: i32) -> Result<(), PackError> {
34    write_data_u8(writer, code::INT32)?;
35    write_data_i32(writer, v)
36}
37
38pub fn pack_i64<W: io::Write>(writer: &mut W, v: i64) -> Result<(), PackError> {
39    write_data_u8(writer, code::INT64)?;
40    write_data_i64(writer, v)
41}
42
43pub fn pack_from_i8<W: io::Write>(writer: &mut W, v: i8) -> Result<(), PackError> {
44    if v > FIX_INT_MAX {
45        write_data_u8(writer, v as u8)
46    } else if v > INT8_MAX {
47        pack_neg_fix_int(writer, v)
48    } else {
49        pack_i8(writer, v)
50    }
51}
52
53pub fn pack_from_i16<W: io::Write>(writer: &mut W, v: i16) -> Result<(), PackError> {
54    if v > INT16_MAX {
55        pack_from_i8(writer, v as i8)
56    } else {
57        pack_i16(writer, v)
58    }
59}
60
61pub fn pack_from_i32<W: io::Write>(writer: &mut W, v: i32) -> Result<(), PackError> {
62    if v > INT32_MAX {
63        pack_from_i16(writer, v as i16)
64    } else {
65        pack_i32(writer, v)
66    }
67}
68
69pub fn pack_from_i64<W: io::Write>(writer: &mut W, v: i64) -> Result<(), PackError> {
70    if v > INT64_MAX {
71        pack_from_i32(writer, v as i32)
72    } else {
73        pack_i64(writer, v)
74    }
75}