parside/message/groups/
trans_receipt_quadruples.rs1use 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}