ipfix_parser/parsers/
mod.rs1mod decoder;
11mod elements;
12mod error;
13mod value;
14
15pub use decoder::{parse_message, parse_messages, Decoder, DecoderConfig, Transport};
16pub use error::{ParseError, Result};
17
18#[derive(Debug, Clone)]
20pub(crate) struct Cursor<'a> {
21 data: &'a [u8],
22 pos: usize,
23}
24
25impl<'a> Cursor<'a> {
26 pub(crate) fn new(data: &'a [u8]) -> Self {
27 Self { data, pos: 0 }
28 }
29
30 pub(crate) fn remaining(&self) -> usize {
32 self.data.len() - self.pos
33 }
34
35 pub(crate) fn is_empty(&self) -> bool {
36 self.remaining() == 0
37 }
38
39 pub(crate) fn read_bytes(&mut self, n: usize, context: &'static str) -> Result<&'a [u8]> {
41 if n > self.remaining() {
42 return Err(ParseError::Truncated {
43 context,
44 needed: n,
45 available: self.remaining(),
46 });
47 }
48 let bytes = &self.data[self.pos..self.pos + n];
49 self.pos += n;
50 Ok(bytes)
51 }
52
53 pub(crate) fn read_rest(&mut self) -> &'a [u8] {
55 let bytes = &self.data[self.pos..];
56 self.pos = self.data.len();
57 bytes
58 }
59
60 pub(crate) fn read_u8(&mut self, context: &'static str) -> Result<u8> {
61 Ok(self.read_bytes(1, context)?[0])
62 }
63
64 pub(crate) fn read_u16(&mut self, context: &'static str) -> Result<u16> {
65 let b = self.read_bytes(2, context)?;
66 Ok(u16::from_be_bytes([b[0], b[1]]))
67 }
68
69 pub(crate) fn read_u32(&mut self, context: &'static str) -> Result<u32> {
70 let b = self.read_bytes(4, context)?;
71 Ok(u32::from_be_bytes([b[0], b[1], b[2], b[3]]))
72 }
73
74 pub(crate) fn read_variable_length(&mut self, context: &'static str) -> Result<usize> {
78 let first = self.read_u8(context)?;
79 if first < 255 {
80 Ok(first as usize)
81 } else {
82 Ok(self.read_u16(context)? as usize)
83 }
84 }
85
86 pub(crate) fn read_field_id(&mut self, context: &'static str) -> Result<(u16, bool)> {
89 let raw = self.read_u16(context)?;
90 Ok((raw & 0x7FFF, raw & 0x8000 != 0))
91 }
92}