pn_dcp/packet/
get_req.rs

1use crate::block::{BlockOptionAndSub, BlockTrait};
2use crate::comm::BytesWrap;
3use crate::options::OptionAndSub;
4use crate::packet::{DcpHead, PnDcp, PnDcpTy};
5use anyhow::bail;
6use pn_dcp_macro::derefmut;
7use pnet::util::MacAddr;
8use std::ops::{Deref, DerefMut};
9#[derive(Debug, Eq, PartialEq, Clone)]
10#[derefmut(head)]
11pub struct PacketGetReq {
12    head: DcpHead,
13    blocks: BlockGetReq,
14}
15
16impl Deref for PacketGetReq {
17    type Target = DcpHead;
18
19    fn deref(&self) -> &Self::Target {
20        &self.head
21    }
22}
23
24impl PacketGetReq {
25    pub fn new(source: MacAddr, dest: MacAddr) -> Self {
26        let head = DcpHead::new(dest, source, PnDcpTy::GetReq);
27        Self {
28            head,
29            blocks: BlockGetReq::default(),
30        }
31    }
32    pub fn append_block(&mut self, option: OptionAndSub) {
33        self.blocks.push(option.into());
34        self.head.add_payload_len(2);
35    }
36    pub fn options(&self) -> Vec<OptionAndSub> {
37        let mut options = Vec::new();
38        let BlockGetReq(datas) = &self.blocks;
39        for block in datas.iter() {
40            options.push(block.0.clone());
41        }
42        options
43    }
44    pub fn to_vec(&self) -> Vec<u8> {
45        let mut data = Vec::with_capacity(self.head.payload_len + 26);
46        self.head.append_data(&mut data);
47        self.blocks.append_data(&mut data);
48        data
49    }
50}
51
52impl TryFrom<PnDcp> for PacketGetReq {
53    type Error = anyhow::Error;
54
55    fn try_from(dcg: PnDcp) -> Result<Self, Self::Error> {
56        let PnDcp { head, blocks } = dcg;
57        if head.ty != PnDcpTy::GetReq {
58            bail!("the packet is pn-dcp, but not get req!");
59        }
60        let blocks = BlockGetReq::try_from(blocks)?;
61        Ok(Self { blocks, head })
62    }
63}
64
65impl TryFrom<&[u8]> for PacketGetReq {
66    type Error = anyhow::Error;
67
68    fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
69        let dcg = PnDcp::try_from(value)?;
70        PacketGetReq::try_from(dcg)
71    }
72}
73
74#[derive(Debug, Eq, PartialEq, Default, Clone)]
75#[derefmut(0)]
76pub struct BlockGetReq(Vec<BlockOptionAndSub>);
77
78impl BlockTrait for BlockGetReq {
79    fn len(&self) -> usize {
80        let mut len = 0;
81        for block in &self.0 {
82            len += block.len();
83        }
84        len
85    }
86
87    fn payload(&self) -> u16 {
88        unreachable!()
89    }
90
91    fn append_data(&self, data: &mut Vec<u8>) {
92        for block in &self.0 {
93            block.append_data(data)
94        }
95    }
96}
97
98impl From<Vec<BlockOptionAndSub>> for BlockGetReq {
99    fn from(a: Vec<BlockOptionAndSub>) -> Self {
100        Self(a)
101    }
102}
103
104impl TryFrom<BytesWrap> for BlockGetReq {
105    type Error = anyhow::Error;
106    fn try_from(value: BytesWrap) -> Result<Self, Self::Error> {
107        let mut index = 0usize;
108        let mut blocks = Vec::<BlockOptionAndSub>::new();
109        while let Ok(tmp) = value.slice(index..) {
110            if tmp.len() == 0 {
111                break;
112            }
113            let one = OptionAndSub::try_from(tmp)?;
114            blocks.push(one.into());
115            index += 2;
116        }
117        Ok(blocks.into())
118    }
119}