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