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; pub 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}