use rustables_macros::{nfnetlink_enum, nfnetlink_struct};
use crate::{
parser_impls::NfNetlinkData,
sys::{
NFTA_CMP_DATA, NFTA_CMP_OP, NFTA_CMP_SREG, NFT_CMP_EQ, NFT_CMP_GT, NFT_CMP_GTE, NFT_CMP_LT,
NFT_CMP_LTE, NFT_CMP_NEQ,
},
};
use super::{Expression, Register};
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[nfnetlink_enum(u32, nested = true)]
pub enum CmpOp {
Eq = NFT_CMP_EQ,
Neq = NFT_CMP_NEQ,
Lt = NFT_CMP_LT,
Lte = NFT_CMP_LTE,
Gt = NFT_CMP_GT,
Gte = NFT_CMP_GTE,
}
#[derive(Default, Debug, Clone, PartialEq, Eq)]
#[nfnetlink_struct]
pub struct Cmp {
#[field(NFTA_CMP_SREG)]
sreg: Register,
#[field(NFTA_CMP_OP)]
op: CmpOp,
#[field(NFTA_CMP_DATA)]
data: NfNetlinkData,
}
impl Cmp {
pub fn new(op: CmpOp, data: impl Into<Vec<u8>>) -> Self {
Cmp {
sreg: Some(Register::Reg1),
op: Some(op),
data: Some(NfNetlinkData::default().with_value(data.into())),
}
}
}
impl Expression for Cmp {
fn get_name() -> &'static str {
"cmp"
}
}