nt_packet/
ext.rs

1use std::io::{Result, Error, ErrorKind};
2use bytes::Buf;
3
4/// Trait containing functions for reading integers from `Buf`
5/// Wraps existing functions, providing a safer API without panics
6pub trait BufExt: Buf {
7    /// Reads an unsigned byte from `self`
8    fn read_u8(&mut self) -> Result<u8> {
9        if self.remaining() >= 1 {
10            Ok(self.get_u8())
11        } else {
12            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 1"))
13        }
14    }
15
16    /// Reads an unsigned big endian short from `self`
17    fn read_u16_be(&mut self) -> Result<u16> {
18        if self.remaining() >= 2 {
19            Ok(self.get_u16_be())
20        } else {
21            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 2"))
22        }
23    }
24
25    /// Reads an unsigned big endian integer from `self`
26    fn read_u32_be(&mut self) -> Result<u32> {
27        if self.remaining() >= 4 {
28            Ok(self.get_u32_be())
29        } else {
30            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 4"))
31        }
32    }
33
34    /// Reads an unsigned big endian long from `self`
35    fn read_u64_be(&mut self) -> Result<u64> {
36        if self.remaining() >= 8 {
37            Ok(self.get_u64_be())
38        } else {
39            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 8"))
40        }
41    }
42
43    /// Reads a signed byte from `self`
44    fn read_i8(&mut self) -> Result<i8> {
45        if self.remaining() >= 1 {
46            Ok(self.get_i8())
47        } else {
48            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 1"))
49        }
50    }
51
52    /// Reads a signed big endian short from `self`
53    fn read_i16_be(&mut self) -> Result<i16> {
54        if self.remaining() >= 2 {
55            Ok(self.get_i16_be())
56        } else {
57            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 2"))
58        }
59    }
60
61    /// Reads a signed big endian integer from `self`
62    fn read_i32_be(&mut self) -> Result<i32> {
63        if self.remaining() >= 4 {
64            Ok(self.get_i32_be())
65        } else {
66            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 4"))
67        }
68    }
69
70    /// Reads a signed big endian long from `self`
71    fn read_i64_be(&mut self) -> Result<i64> {
72        if self.remaining() >= 8 {
73            Ok(self.get_i64_be())
74        } else {
75            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 8"))
76        }
77    }
78
79    /// Reads a double precision floating point number big endian from `self`
80    fn read_f64_be(&mut self) -> Result<f64> {
81        if self.remaining() >= 8 {
82            Ok(self.get_f64_be())
83        } else {
84            Err(Error::new(ErrorKind::UnexpectedEof, "self.remaining() < 8"))
85        }
86    }
87}
88
89impl<B: Buf> BufExt for B {}