parside/message/groups/
trans_receipt_quadruples.rs

1use crate::error::ParsideResult;
2use crate::message::cold_code::ColdCode;
3use crate::message::parsers::Parsers;
4use crate::message::{Group, GroupItem};
5use cesride::counter::Codex;
6use cesride::{Counter, Indexer, Matter, Prefixer, Saider, Seqner, Siger};
7use nom::multi::count;
8use nom::sequence::tuple;
9
10#[derive(Debug, Clone, Default)]
11pub struct TransReceiptQuadruples {
12    pub value: Vec<TransReceiptQuadruple>,
13}
14
15impl Group<TransReceiptQuadruple> for TransReceiptQuadruples {
16    const CODE: &'static str = Codex::TransReceiptQuadruples;
17
18    fn new(value: Vec<TransReceiptQuadruple>) -> Self {
19        Self { value }
20    }
21
22    fn value(&self) -> &Vec<TransReceiptQuadruple> {
23        &self.value
24    }
25}
26
27impl TransReceiptQuadruples {
28    pub(crate) fn from_stream_bytes<'a>(
29        bytes: &'a [u8],
30        counter: &Counter,
31        cold_code: &ColdCode,
32    ) -> ParsideResult<(&'a [u8], TransReceiptQuadruples)> {
33        let (rest, body) = count(
34            tuple((
35                Parsers::prefixer_parser(cold_code)?,
36                Parsers::seqner_parser(cold_code)?,
37                Parsers::saider_parser(cold_code)?,
38                Parsers::siger_parser(cold_code)?,
39            )),
40            counter.count() as usize,
41        )(bytes)?;
42        let body = body
43            .into_iter()
44            .map(|(prefixer, seqner, saider, siger)| TransReceiptQuadruple {
45                prefixer,
46                seqner,
47                saider,
48                siger,
49            })
50            .collect();
51
52        Ok((rest, TransReceiptQuadruples { value: body }))
53    }
54}
55
56#[derive(Debug, Clone, Default)]
57pub struct TransReceiptQuadruple {
58    pub prefixer: Prefixer,
59    pub seqner: Seqner,
60    pub saider: Saider,
61    pub siger: Siger,
62}
63
64impl TransReceiptQuadruple {
65    pub fn new(prefixer: Prefixer, seqner: Seqner, saider: Saider, siger: Siger) -> Self {
66        Self { prefixer, seqner, saider, siger }
67    }
68}
69
70impl GroupItem for TransReceiptQuadruple {
71    fn qb64(&self) -> ParsideResult<String> {
72        let mut out = "\0".repeat(self.full_size()?);
73        let mut offset = 0;
74        let mut len = self.prefixer.full_size()?;
75        unsafe { out[offset..len].as_bytes_mut() }
76            .copy_from_slice(self.prefixer.qb64()?.as_bytes());
77        offset += len;
78        len = self.seqner.full_size()?;
79        unsafe { out[offset..len].as_bytes_mut() }.copy_from_slice(self.seqner.qb64()?.as_bytes());
80        offset += len;
81        len = self.saider.full_size()?;
82        unsafe { out[offset..len].as_bytes_mut() }.copy_from_slice(self.saider.qb64()?.as_bytes());
83        offset += len;
84        len = self.siger.full_size()?;
85        unsafe { out[offset..len].as_bytes_mut() }.copy_from_slice(self.siger.qb64()?.as_bytes());
86        Ok(out)
87    }
88
89    fn qb64b(&self) -> ParsideResult<Vec<u8>> {
90        let mut out = vec![0u8; self.full_size()?];
91        let mut offset = 0;
92        let mut len = self.prefixer.full_size()?;
93        out[offset..len].copy_from_slice(&self.prefixer.qb64b()?);
94        offset += len;
95        len = self.seqner.full_size()?;
96        out[offset..len].copy_from_slice(&self.seqner.qb64b()?);
97        offset += len;
98        len = self.saider.full_size()?;
99        out[offset..len].copy_from_slice(&self.saider.qb64b()?);
100        offset += len;
101        len = self.siger.full_size()?;
102        out[offset..len].copy_from_slice(&self.siger.qb64b()?);
103        Ok(out)
104    }
105
106    fn qb2(&self) -> ParsideResult<Vec<u8>> {
107        let mut out = vec![0u8; self.full_size()? / 4 * 3];
108        let mut offset = 0;
109        let mut len = self.prefixer.full_size()? / 4 * 3;
110        out[offset..len].copy_from_slice(&self.prefixer.qb2()?);
111        offset += len;
112        len = self.seqner.full_size()? / 4 * 3;
113        out[offset..len].copy_from_slice(&self.seqner.qb2()?);
114        offset += len;
115        len = self.saider.full_size()? / 4 * 3;
116        out[offset..len].copy_from_slice(&self.saider.qb2()?);
117        offset += len;
118        len = self.siger.full_size()? / 4 * 3;
119        out[offset..len].copy_from_slice(&self.siger.qb2()?);
120        Ok(out)
121    }
122
123    fn full_size(&self) -> ParsideResult<usize> {
124        let size = self.prefixer.full_size()?
125            + self.seqner.full_size()?
126            + self.saider.full_size()?
127            + self.siger.full_size()?;
128        Ok(size)
129    }
130}