1use serde::de::{self, SeqAccess, Visitor};
11use serde::ser::{SerializeSeq, SerializeTuple};
12use serde::{Deserialize, Deserializer, Serialize, Serializer};
13
14use bb_ir::slot_value::{wire_decoder_registry, SlotValue as IrSlotValue};
15use bb_ir::types::{
16 TYPE_ADDRESS_VEC, TYPE_BYTES, TYPE_COMPOSITE, TYPE_MULTIADDRESS, TYPE_PEER_ID,
17 TYPE_PEER_ID_VEC, TYPE_TRIGGER, TYPE_WIRE_REQ_ID,
18};
19use bb_ir::{register_charged_bytes, register_type_node};
20
21use crate::framework::Address;
22use crate::ids::{CommandId, PeerId};
23
24#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
27pub struct TriggerValue;
28
29#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
31pub struct PeerIdValue(pub PeerId);
32
33#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
38pub struct PeerIdVecValue(pub Vec<PeerId>);
39
40#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
42pub struct CommandIdValue(pub CommandId);
43
44#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
47pub struct TimestampValue(pub u64);
48
49#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
52pub struct WireReqIdValue(pub u64);
53
54#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
56pub struct CorrelationTokenValue(pub u64);
57
58#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
60pub struct AddressValue(pub Address);
61
62#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
68pub struct AddressVecValue(pub Vec<Address>);
69
70#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
72pub struct BytesValue(pub Vec<u8>);
73
74pub struct CompositeValue {
81 pub children: Vec<Box<dyn IrSlotValue>>,
85}
86
87impl Clone for CompositeValue {
88 fn clone(&self) -> Self {
89 Self {
90 children: self.children.iter().map(|c| c.clone_boxed()).collect(),
91 }
92 }
93}
94
95impl std::fmt::Debug for CompositeValue {
96 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
97 let hashes: Vec<u64> = self.children.iter().map(|c| c.type_hash()).collect();
101 f.debug_struct("CompositeValue")
102 .field("children_len", &self.children.len())
103 .field("child_type_hashes", &hashes)
104 .finish()
105 }
106}
107
108impl Serialize for CompositeValue {
115 fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
116 let mut seq = ser.serialize_seq(Some(self.children.len()))?;
117 for child in &self.children {
118 let bytes = child.to_wire_bytes().map_err(|e| {
119 serde::ser::Error::custom(format!("CompositeValue child encode: {e}"))
120 })?;
121 seq.serialize_element(&WireChild {
125 type_hash: child.type_hash(),
126 bytes,
127 })?;
128 }
129 seq.end()
130 }
131}
132
133impl<'de> Deserialize<'de> for CompositeValue {
134 fn deserialize<D: Deserializer<'de>>(de: D) -> Result<Self, D::Error> {
135 struct ChildrenVisitor;
136 impl<'de> Visitor<'de> for ChildrenVisitor {
137 type Value = Vec<Box<dyn IrSlotValue>>;
138 fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
139 write!(f, "a sequence of (type_hash, bytes) child entries")
140 }
141 fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
142 let mut out: Vec<Box<dyn IrSlotValue>> =
143 Vec::with_capacity(seq.size_hint().unwrap_or(0));
144 while let Some(entry) = seq.next_element::<WireChild>()? {
145 let decoder = wire_decoder_registry()
146 .get(&entry.type_hash)
147 .copied()
148 .ok_or_else(|| {
149 de::Error::custom(format!(
150 "CompositeValue child decode: no decoder registered for type_hash {:#018x}",
151 entry.type_hash,
152 ))
153 })?;
154 let child = decoder(&entry.bytes).map_err(|e| {
155 de::Error::custom(format!("CompositeValue child decode: {e}"))
156 })?;
157 out.push(child);
158 }
159 Ok(out)
160 }
161 }
162 let children = de.deserialize_seq(ChildrenVisitor)?;
163 Ok(CompositeValue { children })
164 }
165}
166
167struct WireChild {
171 type_hash: u64,
172 bytes: Vec<u8>,
173}
174
175impl Serialize for WireChild {
176 fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
177 let mut t = ser.serialize_tuple(2)?;
178 t.serialize_element(&self.type_hash)?;
179 t.serialize_element(&self.bytes)?;
180 t.end()
181 }
182}
183
184impl<'de> Deserialize<'de> for WireChild {
185 fn deserialize<D: Deserializer<'de>>(de: D) -> Result<Self, D::Error> {
186 let (type_hash, bytes) = <(u64, Vec<u8>)>::deserialize(de)?;
189 Ok(WireChild { type_hash, bytes })
190 }
191}
192
193#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
196pub struct U64Value(pub u64);
197
198register_type_node!(TriggerValue, &TYPE_TRIGGER);
205register_type_node!(PeerIdValue, &TYPE_PEER_ID);
206register_type_node!(PeerIdVecValue, &TYPE_PEER_ID_VEC);
207register_type_node!(WireReqIdValue, &TYPE_WIRE_REQ_ID);
208register_type_node!(BytesValue, &TYPE_BYTES);
209register_type_node!(AddressValue, &TYPE_MULTIADDRESS);
210register_type_node!(AddressVecValue, &TYPE_ADDRESS_VEC);
211register_type_node!(CompositeValue, &TYPE_COMPOSITE);
212
213register_charged_bytes!(BytesValue, |b: &BytesValue| b.0.len());
221