parside/message/groups/
attached_material_quadlets.rs

1use crate::error::ParsideResult;
2use crate::message::cold_code::ColdCode;
3use crate::message::{Group, GroupItem};
4use crate::{nomify, CesrGroup};
5use cesride::counter::Codex;
6use cesride::Counter;
7use nom::multi::many0;
8
9#[derive(Debug, Clone, Default)]
10pub struct AttachedMaterialQuadlets {
11    pub value: Vec<CesrGroup>,
12}
13
14impl Group<CesrGroup> for AttachedMaterialQuadlets {
15    const CODE: &'static str = Codex::AttachedMaterialQuadlets;
16
17    fn new(value: Vec<CesrGroup>) -> Self {
18        Self { value }
19    }
20
21    fn value(&self) -> &Vec<CesrGroup> {
22        &self.value
23    }
24}
25
26impl AttachedMaterialQuadlets {
27    pub(crate) fn from_stream_bytes<'a>(
28        bytes: &'a [u8],
29        _counter: &Counter,
30        _cold_code: &ColdCode,
31    ) -> ParsideResult<(&'a [u8], AttachedMaterialQuadlets)> {
32        let (rest, body) = many0(nomify!(CesrGroup::from_stream_bytes))(bytes)?;
33        Ok((rest, AttachedMaterialQuadlets { value: body }))
34    }
35}
36
37impl GroupItem for CesrGroup {
38    fn qb64(&self) -> ParsideResult<String> {
39        match self {
40            CesrGroup::ControllerIdxSigsVariant { value } => value.qb64(),
41            CesrGroup::WitnessIdxSigsVariant { value } => value.qb64(),
42            CesrGroup::NonTransReceiptCouplesVariant { value } => value.qb64(),
43            CesrGroup::TransReceiptQuadruplesVariant { value } => value.qb64(),
44            CesrGroup::TransIdxSigGroupsVariant { value } => value.qb64(),
45            CesrGroup::TransLastIdxSigGroupsVariant { value } => value.qb64(),
46            CesrGroup::FirstSeenReplayCouplesVariant { value } => value.qb64(),
47            CesrGroup::SealSourceCouplesVariant { value } => value.qb64(),
48            CesrGroup::AttachedMaterialQuadletsVariant { value } => value.qb64(),
49            CesrGroup::SadPathSigGroupVariant { value } => value.qb64(),
50            CesrGroup::SadPathSigVariant { value } => value.qb64(),
51            CesrGroup::PathedMaterialQuadletsVariant { value } => value.qb64(),
52        }
53    }
54
55    fn qb64b(&self) -> ParsideResult<Vec<u8>> {
56        match self {
57            CesrGroup::ControllerIdxSigsVariant { value } => value.qb64b(),
58            CesrGroup::WitnessIdxSigsVariant { value } => value.qb64b(),
59            CesrGroup::NonTransReceiptCouplesVariant { value } => value.qb64b(),
60            CesrGroup::TransReceiptQuadruplesVariant { value } => value.qb64b(),
61            CesrGroup::TransIdxSigGroupsVariant { value } => value.qb64b(),
62            CesrGroup::TransLastIdxSigGroupsVariant { value } => value.qb64b(),
63            CesrGroup::FirstSeenReplayCouplesVariant { value } => value.qb64b(),
64            CesrGroup::SealSourceCouplesVariant { value } => value.qb64b(),
65            CesrGroup::AttachedMaterialQuadletsVariant { value } => value.qb64b(),
66            CesrGroup::SadPathSigGroupVariant { value } => value.qb64b(),
67            CesrGroup::SadPathSigVariant { value } => value.qb64b(),
68            CesrGroup::PathedMaterialQuadletsVariant { value } => value.qb64b(),
69        }
70    }
71
72    fn qb2(&self) -> ParsideResult<Vec<u8>> {
73        match self {
74            CesrGroup::ControllerIdxSigsVariant { value } => value.qb2(),
75            CesrGroup::WitnessIdxSigsVariant { value } => value.qb2(),
76            CesrGroup::NonTransReceiptCouplesVariant { value } => value.qb2(),
77            CesrGroup::TransReceiptQuadruplesVariant { value } => value.qb2(),
78            CesrGroup::TransIdxSigGroupsVariant { value } => value.qb2(),
79            CesrGroup::TransLastIdxSigGroupsVariant { value } => value.qb2(),
80            CesrGroup::FirstSeenReplayCouplesVariant { value } => value.qb2(),
81            CesrGroup::SealSourceCouplesVariant { value } => value.qb2(),
82            CesrGroup::AttachedMaterialQuadletsVariant { value } => value.qb2(),
83            CesrGroup::SadPathSigGroupVariant { value } => value.qb2(),
84            CesrGroup::SadPathSigVariant { value } => value.qb2(),
85            CesrGroup::PathedMaterialQuadletsVariant { value } => value.qb2(),
86        }
87    }
88
89    fn full_size(&self) -> ParsideResult<usize> {
90        match self {
91            Self::ControllerIdxSigsVariant { value } => value.full_size(),
92            Self::WitnessIdxSigsVariant { value } => value.full_size(),
93            Self::NonTransReceiptCouplesVariant { value } => value.full_size(),
94            Self::TransReceiptQuadruplesVariant { value } => value.full_size(),
95            Self::TransIdxSigGroupsVariant { value } => value.full_size(),
96            Self::TransLastIdxSigGroupsVariant { value } => value.full_size(),
97            Self::FirstSeenReplayCouplesVariant { value } => value.full_size(),
98            Self::SealSourceCouplesVariant { value } => value.full_size(),
99            Self::AttachedMaterialQuadletsVariant { value } => value.full_size(),
100            Self::SadPathSigGroupVariant { value } => value.full_size(),
101            Self::SadPathSigVariant { value } => value.full_size(),
102            Self::PathedMaterialQuadletsVariant { value } => value.full_size(),
103        }
104    }
105}
106
107#[cfg(test)]
108mod test {
109    use crate::message::groups::group::GroupItem;
110    use crate::{CesrGroup, MessageList};
111
112    #[test]
113    fn sanity() {
114        let quadlets = b"-VBj-JAB6AABAAA--FABEA_1ZGv4tEhJW2AYH0wLh2lLlllmH3dwpH3RGs2GtgXr0AAAAAAAAAAAAAAAAAAAAAAAEA_1ZGv4tEhJW2AYH0wLh2lLlllmH3dwpH3RGs2GtgXr-AADAABTqch8XeSwyCKFLV1I2OZLLXCCRvjdqiFkTmacYgc1ZgFoAXrUf5ME9IXjA9msTuswpbiKUW64_gW9C8gZCu8JABDRYWR7nw_MEnGE4FN0xmUL-5pVDRkPJGFMK9kcs3XLvQA5KNoMt1kREz4IsPVBgE4ltE44F-6oQ6TYtaoSwb4OACDsl4VeiqrIk9EMy6E58dNao3J2SQJRAmVNgvF7I3t1Uf7ZJ_bOLcouvlcyq46FcpDCL2SmVSuW-ITsbgjz_uwJ";
115        let (_, message_list) = MessageList::from_stream_bytes(quadlets).unwrap();
116
117        let message = message_list.messages.first().unwrap();
118        let group = message.cesr_group().unwrap();
119        match group {
120            CesrGroup::AttachedMaterialQuadletsVariant { value: _ } => {
121                assert_eq!(group.qb64().unwrap(), String::from_utf8(quadlets.to_vec()).unwrap());
122            }
123            _ => panic!("this shouldn't happen"),
124        }
125    }
126}