Skip to content

Commit 81358bb

Browse files
mikemiles-devmikemiles-dev
and
mikemiles-dev
authored
feat: datanumber macro cleanup (#98)
Co-authored-by: mikemiles-dev <michaelmileusnich@Michaels-MacBook-Air-2.local>
1 parent 9a25a04 commit 81358bb

File tree

2 files changed

+72
-169
lines changed

2 files changed

+72
-169
lines changed

src/variable_versions/data_number.rs

+68-164
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,43 @@ use std::convert::Into;
1313
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
1414
use std::time::Duration;
1515

16+
macro_rules! impl_try_from_data_number {
17+
($($t:ty => $v:ident),*) => {
18+
$(
19+
impl TryFrom<&DataNumber> for $t {
20+
type Error = DataNumberError;
21+
22+
fn try_from(val: &DataNumber) -> Result<Self, Self::Error> {
23+
match val {
24+
DataNumber::$v(i) => Ok(*i),
25+
_ => Err(DataNumberError::InvalidDataType),
26+
}
27+
}
28+
}
29+
)*
30+
};
31+
}
32+
33+
macro_rules! impl_try_from_field_value {
34+
($($t:ty => $v:ident),*) => {
35+
$(
36+
impl TryFrom<&FieldValue> for $t {
37+
type Error = FieldValueError;
38+
39+
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
40+
match value {
41+
FieldValue::DataNumber(d) => {
42+
let d: $t = d.try_into().map_err(|_| FieldValueError::InvalidDataType)?;
43+
Ok(d)
44+
}
45+
_ => Err(FieldValueError::InvalidDataType),
46+
}
47+
}
48+
}
49+
)*
50+
};
51+
}
52+
1653
/// Holds our datatypes and values post parsing
1754
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Serialize)]
1855
#[serde(untagged)]
@@ -32,68 +69,44 @@ pub enum DataNumberError {
3269
InvalidDataType,
3370
}
3471

35-
impl TryFrom<&DataNumber> for u8 {
36-
type Error = DataNumberError;
37-
38-
fn try_from(val: &DataNumber) -> Result<Self, Self::Error> {
39-
match val {
40-
DataNumber::U8(i) => Ok(*i),
41-
_ => Err(DataNumberError::InvalidDataType),
42-
}
43-
}
44-
}
45-
46-
impl TryFrom<&DataNumber> for u16 {
47-
type Error = DataNumberError;
48-
49-
fn try_from(val: &DataNumber) -> Result<Self, Self::Error> {
50-
match val {
51-
DataNumber::U16(i) => Ok(*i),
52-
_ => Err(DataNumberError::InvalidDataType),
53-
}
54-
}
55-
}
72+
impl_try_from_data_number!(
73+
u8 => U8,
74+
u16 => U16,
75+
u32 => U32,
76+
i32 => I32,
77+
u64 => U64,
78+
u128 => U128
79+
);
80+
81+
impl_try_from_field_value!(
82+
u8 => DataNumber,
83+
u16 => DataNumber,
84+
u32 => DataNumber,
85+
i32 => DataNumber,
86+
u64 => DataNumber,
87+
u128 => DataNumber
88+
);
5689

57-
impl TryFrom<&DataNumber> for u32 {
58-
type Error = DataNumberError;
59-
60-
fn try_from(val: &DataNumber) -> Result<Self, Self::Error> {
61-
match val {
62-
DataNumber::U32(i) => Ok(*i),
63-
_ => Err(DataNumberError::InvalidDataType),
64-
}
65-
}
66-
}
67-
68-
impl TryFrom<&DataNumber> for i32 {
69-
type Error = DataNumberError;
70-
71-
fn try_from(val: &DataNumber) -> Result<Self, Self::Error> {
72-
match val {
73-
DataNumber::I32(i) => Ok(*i),
74-
_ => Err(DataNumberError::InvalidDataType),
75-
}
76-
}
77-
}
78-
79-
impl TryFrom<&DataNumber> for u64 {
80-
type Error = DataNumberError;
90+
impl TryFrom<&FieldValue> for String {
91+
type Error = FieldValueError;
8192

82-
fn try_from(val: &DataNumber) -> Result<Self, Self::Error> {
83-
match val {
84-
DataNumber::U64(i) => Ok(*i),
85-
_ => Err(DataNumberError::InvalidDataType),
93+
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
94+
match value {
95+
FieldValue::String(s) => Ok(s.clone()),
96+
FieldValue::MacAddr(s) => Ok(s.to_string()),
97+
_ => Err(FieldValueError::InvalidDataType),
8698
}
8799
}
88100
}
89101

90-
impl TryFrom<&DataNumber> for u128 {
91-
type Error = DataNumberError;
102+
impl TryFrom<&FieldValue> for IpAddr {
103+
type Error = FieldValueError;
92104

93-
fn try_from(val: &DataNumber) -> Result<Self, Self::Error> {
94-
match val {
95-
DataNumber::U128(i) => Ok(*i),
96-
_ => Err(DataNumberError::InvalidDataType),
105+
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
106+
match value {
107+
FieldValue::Ip4Addr(ip) => Ok(IpAddr::V4(*ip)),
108+
FieldValue::Ip6Addr(ip) => Ok(IpAddr::V6(*ip)),
109+
_ => Err(FieldValueError::InvalidDataType),
97110
}
98111
}
99112
}
@@ -281,114 +294,6 @@ pub enum FieldValueError {
281294
InvalidDataType,
282295
}
283296

284-
impl TryFrom<&FieldValue> for String {
285-
type Error = FieldValueError;
286-
287-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
288-
match value {
289-
FieldValue::String(s) => Ok(s.clone()),
290-
FieldValue::MacAddr(s) => Ok(s.to_string()),
291-
_ => Err(FieldValueError::InvalidDataType),
292-
}
293-
}
294-
}
295-
296-
impl TryFrom<&FieldValue> for IpAddr {
297-
type Error = FieldValueError;
298-
299-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
300-
match value {
301-
FieldValue::Ip4Addr(ip) => Ok(IpAddr::V4(*ip)),
302-
FieldValue::Ip6Addr(ip) => Ok(IpAddr::V6(*ip)),
303-
_ => Err(FieldValueError::InvalidDataType),
304-
}
305-
}
306-
}
307-
308-
impl TryFrom<&FieldValue> for u8 {
309-
type Error = FieldValueError;
310-
311-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
312-
match value {
313-
FieldValue::DataNumber(d) => {
314-
let d: u8 = d.try_into().map_err(|_| FieldValueError::InvalidDataType)?;
315-
Ok(d)
316-
}
317-
_ => Err(FieldValueError::InvalidDataType),
318-
}
319-
}
320-
}
321-
322-
impl TryFrom<&FieldValue> for u16 {
323-
type Error = FieldValueError;
324-
325-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
326-
match value {
327-
FieldValue::DataNumber(d) => {
328-
let d: u16 = d.try_into().map_err(|_| FieldValueError::InvalidDataType)?;
329-
Ok(d)
330-
}
331-
_ => Err(FieldValueError::InvalidDataType),
332-
}
333-
}
334-
}
335-
336-
impl TryFrom<&FieldValue> for u32 {
337-
type Error = FieldValueError;
338-
339-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
340-
match value {
341-
FieldValue::DataNumber(d) => {
342-
let d: u32 = d.try_into().map_err(|_| FieldValueError::InvalidDataType)?;
343-
Ok(d)
344-
}
345-
_ => Err(FieldValueError::InvalidDataType),
346-
}
347-
}
348-
}
349-
350-
impl TryFrom<&FieldValue> for i32 {
351-
type Error = FieldValueError;
352-
353-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
354-
match value {
355-
FieldValue::DataNumber(d) => {
356-
let d: i32 = d.try_into().map_err(|_| FieldValueError::InvalidDataType)?;
357-
Ok(d)
358-
}
359-
_ => Err(FieldValueError::InvalidDataType),
360-
}
361-
}
362-
}
363-
364-
impl TryFrom<&FieldValue> for u64 {
365-
type Error = FieldValueError;
366-
367-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
368-
match value {
369-
FieldValue::DataNumber(d) => {
370-
let d: u64 = d.try_into().map_err(|_| FieldValueError::InvalidDataType)?;
371-
Ok(d)
372-
}
373-
_ => Err(FieldValueError::InvalidDataType),
374-
}
375-
}
376-
}
377-
378-
impl TryFrom<&FieldValue> for u128 {
379-
type Error = FieldValueError;
380-
381-
fn try_from(value: &FieldValue) -> Result<Self, Self::Error> {
382-
match value {
383-
FieldValue::DataNumber(d) => {
384-
let d: u128 = d.try_into().map_err(|_| FieldValueError::InvalidDataType)?;
385-
Ok(d)
386-
}
387-
_ => Err(FieldValueError::InvalidDataType),
388-
}
389-
}
390-
}
391-
392297
impl FieldValue {
393298
pub fn to_be_bytes(&self) -> Vec<u8> {
394299
match self {
@@ -427,7 +332,6 @@ mod data_number_tests {
427332
fn it_tests_3_byte_data_number_exports() {
428333
use super::DataNumber;
429334
let data = DataNumber::parse(&[1, 246, 118], 3, false).unwrap().1;
430-
println!("{:?}", data);
431335
assert_eq!(data.to_be_bytes(), vec![1, 246, 118]);
432336
}
433337
}

src/variable_versions/v9.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -321,15 +321,14 @@ fn parse_set_body<'a>(
321321
fn parse_flowsets<'a>(
322322
i: &'a [u8],
323323
parser: &mut V9Parser,
324-
count: u16,
324+
record_count: u16,
325325
) -> IResult<&'a [u8], Vec<FlowSet>> {
326326
let mut flowsets = vec![];
327327
let mut remaining = i;
328-
329-
let mut count_index = 0;
328+
let mut record_count_index = 0;
330329

331330
// Header.count represents total number of records in data + records in templates
332-
while !remaining.is_empty() && count_index < count {
331+
while !remaining.is_empty() && record_count_index < record_count {
333332
let (i, mut flowset) = FlowSet::parse(remaining, parser)?;
334333

335334
if flowset.is_empty() {
@@ -345,7 +344,7 @@ fn parse_flowsets<'a>(
345344

346345
flowsets.push(flowset);
347346

348-
count_index += 1;
347+
record_count_index += 1;
349348
}
350349

351350
Ok((remaining, flowsets))

0 commit comments

Comments
 (0)