1use std::io::SeekFrom;
2use crate::*;
3
4impl cbor_event::se::Serialize for NativeScript {
5 fn serialize<'se, W: Write>(
6 &self,
7 serializer: &'se mut Serializer<W>,
8 ) -> cbor_event::Result<&'se mut Serializer<W>> {
9 self.0.serialize(serializer)
10 }
11}
12
13impl Deserialize for NativeScript {
14 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
15 Ok(Self(NativeScriptEnum::deserialize(raw)?))
16 }
17}
18
19impl cbor_event::se::Serialize for NativeScriptEnum {
20 fn serialize<'se, W: Write>(
21 &self,
22 serializer: &'se mut Serializer<W>,
23 ) -> cbor_event::Result<&'se mut Serializer<W>> {
24 match self {
25 NativeScriptEnum::ScriptPubkey(x) => x.serialize(serializer),
26 NativeScriptEnum::ScriptAll(x) => x.serialize(serializer),
27 NativeScriptEnum::ScriptAny(x) => x.serialize(serializer),
28 NativeScriptEnum::ScriptNOfK(x) => x.serialize(serializer),
29 NativeScriptEnum::TimelockStart(x) => x.serialize(serializer),
30 NativeScriptEnum::TimelockExpiry(x) => x.serialize(serializer),
31 }
32 }
33}
34
35impl Deserialize for NativeScriptEnum {
36 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
37 (|| -> Result<_, DeserializeError> {
38 let len = raw.array()?;
39 let initial_position = raw.as_mut_ref().seek(SeekFrom::Current(0)).unwrap();
41 match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
42 Ok(ScriptPubkey::deserialize_as_embedded_group(
43 raw, len,
44 )?)
45 })(raw)
46 {
47 Ok(variant) => return Ok(NativeScriptEnum::ScriptPubkey(variant)),
48 Err(_) => raw
49 .as_mut_ref()
50 .seek(SeekFrom::Start(initial_position))
51 .unwrap(),
52 };
53 match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
54 Ok(ScriptAll::deserialize_as_embedded_group(
55 raw, len,
56 )?)
57 })(raw)
58 {
59 Ok(variant) => return Ok(NativeScriptEnum::ScriptAll(variant)),
60 Err(_) => raw
61 .as_mut_ref()
62 .seek(SeekFrom::Start(initial_position))
63 .unwrap(),
64 };
65 match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
66 Ok(ScriptAny::deserialize_as_embedded_group(
67 raw, len,
68 )?)
69 })(raw)
70 {
71 Ok(variant) => return Ok(NativeScriptEnum::ScriptAny(variant)),
72 Err(_) => raw
73 .as_mut_ref()
74 .seek(SeekFrom::Start(initial_position))
75 .unwrap(),
76 };
77 match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
78 Ok(ScriptNOfK::deserialize_as_embedded_group(
79 raw, len,
80 )?)
81 })(raw)
82 {
83 Ok(variant) => return Ok(NativeScriptEnum::ScriptNOfK(variant)),
84 Err(_) => raw
85 .as_mut_ref()
86 .seek(SeekFrom::Start(initial_position))
87 .unwrap(),
88 };
89 match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
90 Ok(TimelockStart::deserialize_as_embedded_group(
91 raw, len,
92 )?)
93 })(raw)
94 {
95 Ok(variant) => return Ok(NativeScriptEnum::TimelockStart(variant)),
96 Err(_) => raw
97 .as_mut_ref()
98 .seek(SeekFrom::Start(initial_position))
99 .unwrap(),
100 };
101 match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
102 Ok(TimelockExpiry::deserialize_as_embedded_group(
103 raw, len,
104 )?)
105 })(raw)
106 {
107 Ok(variant) => return Ok(NativeScriptEnum::TimelockExpiry(variant)),
108 Err(_) => raw
109 .as_mut_ref()
110 .seek(SeekFrom::Start(initial_position))
111 .unwrap(),
112 };
113 match len {
114 cbor_event::Len::Len(_) => (), cbor_event::Len::Indefinite => match raw.special()? {
116 CBORSpecial::Break => (), _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
118 },
119 }
120 Err(DeserializeError::new(
121 "NativeScriptEnum",
122 DeserializeFailure::NoVariantMatched.into(),
123 ))
124 })()
125 .map_err(|e| e.annotate("NativeScriptEnum"))
126 }
127}
128
129
130impl cbor_event::se::Serialize for ScriptPubkey {
131 fn serialize<'se, W: Write>(
132 &self,
133 serializer: &'se mut Serializer<W>,
134 ) -> cbor_event::Result<&'se mut Serializer<W>> {
135 serializer.write_array(cbor_event::Len::Len(2))?;
136 self.serialize_as_embedded_group(serializer)
137 }
138}
139
140impl SerializeEmbeddedGroup for ScriptPubkey {
141 fn serialize_as_embedded_group<'se, W: Write>(
142 &self,
143 serializer: &'se mut Serializer<W>,
144 ) -> cbor_event::Result<&'se mut Serializer<W>> {
145 serializer.write_unsigned_integer(0u64)?;
146 self.addr_keyhash.serialize(serializer)?;
147 Ok(serializer)
148 }
149}
150
151impl Deserialize for ScriptPubkey {
152 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
153 (|| -> Result<_, DeserializeError> {
154 let len = raw.array()?;
155 let mut read_len = CBORReadLen::new(len);
156 read_len.read_elems(2)?;
157 let ret = Self::deserialize_as_embedded_group(raw, len);
158 match len {
159 cbor_event::Len::Len(_) => read_len.finish()?,
160 cbor_event::Len::Indefinite => match raw.special()? {
161 CBORSpecial::Break => (),
162 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
163 },
164 }
165 ret
166 })()
167 .map_err(|e| e.annotate("ScriptPubkey"))
168 }
169}
170
171impl DeserializeEmbeddedGroup for ScriptPubkey {
172 fn deserialize_as_embedded_group<R: BufRead + Seek>(
173 raw: &mut Deserializer<R>,
174 _: cbor_event::Len,
175 ) -> Result<Self, DeserializeError> {
176 (|| -> Result<_, DeserializeError> {
177 let index_0_value = raw.unsigned_integer()?;
178 if index_0_value != 0 {
179 return Err(DeserializeFailure::FixedValueMismatch {
180 found: Key::Uint(index_0_value),
181 expected: Key::Uint(0),
182 }
183 .into());
184 }
185 Ok(())
186 })()
187 .map_err(|e| e.annotate("index_0"))?;
188 let addr_keyhash =
189 (|| -> Result<_, DeserializeError> { Ok(Ed25519KeyHash::deserialize(raw)?) })()
190 .map_err(|e| e.annotate("addr_keyhash"))?;
191 Ok(ScriptPubkey { addr_keyhash })
192 }
193}
194
195impl cbor_event::se::Serialize for ScriptAll {
196 fn serialize<'se, W: Write>(
197 &self,
198 serializer: &'se mut Serializer<W>,
199 ) -> cbor_event::Result<&'se mut Serializer<W>> {
200 serializer.write_array(cbor_event::Len::Len(2))?;
201 self.serialize_as_embedded_group(serializer)
202 }
203}
204
205impl SerializeEmbeddedGroup for ScriptAll {
206 fn serialize_as_embedded_group<'se, W: Write>(
207 &self,
208 serializer: &'se mut Serializer<W>,
209 ) -> cbor_event::Result<&'se mut Serializer<W>> {
210 serializer.write_unsigned_integer(1u64)?;
211 self.native_scripts.serialize(serializer)?;
212 Ok(serializer)
213 }
214}
215
216impl Deserialize for ScriptAll {
217 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
218 (|| -> Result<_, DeserializeError> {
219 let len = raw.array()?;
220 let mut read_len = CBORReadLen::new(len);
221 read_len.read_elems(2)?;
222 let ret = Self::deserialize_as_embedded_group(raw, len);
223 match len {
224 cbor_event::Len::Len(_) => read_len.finish()?,
225 cbor_event::Len::Indefinite => match raw.special()? {
226 CBORSpecial::Break => (),
227 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
228 },
229 }
230 ret
231 })()
232 .map_err(|e| e.annotate("ScriptAll"))
233 }
234}
235
236impl DeserializeEmbeddedGroup for ScriptAll {
237 fn deserialize_as_embedded_group<R: BufRead + Seek>(
238 raw: &mut Deserializer<R>,
239 _: cbor_event::Len,
240 ) -> Result<Self, DeserializeError> {
241 (|| -> Result<_, DeserializeError> {
242 let index_0_value = raw.unsigned_integer()?;
243 if index_0_value != 1 {
244 return Err(DeserializeFailure::FixedValueMismatch {
245 found: Key::Uint(index_0_value),
246 expected: Key::Uint(1),
247 }
248 .into());
249 }
250 Ok(())
251 })()
252 .map_err(|e| e.annotate("index_0"))?;
253 let native_scripts =
254 (|| -> Result<_, DeserializeError> { Ok(NativeScripts::deserialize(raw)?) })()
255 .map_err(|e| e.annotate("native_scripts"))?;
256 Ok(ScriptAll { native_scripts })
257 }
258}
259
260impl cbor_event::se::Serialize for ScriptAny {
261 fn serialize<'se, W: Write>(
262 &self,
263 serializer: &'se mut Serializer<W>,
264 ) -> cbor_event::Result<&'se mut Serializer<W>> {
265 serializer.write_array(cbor_event::Len::Len(2))?;
266 self.serialize_as_embedded_group(serializer)
267 }
268}
269
270impl SerializeEmbeddedGroup for ScriptAny {
271 fn serialize_as_embedded_group<'se, W: Write>(
272 &self,
273 serializer: &'se mut Serializer<W>,
274 ) -> cbor_event::Result<&'se mut Serializer<W>> {
275 serializer.write_unsigned_integer(2u64)?;
276 self.native_scripts.serialize(serializer)?;
277 Ok(serializer)
278 }
279}
280
281impl Deserialize for ScriptAny {
282 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
283 (|| -> Result<_, DeserializeError> {
284 let len = raw.array()?;
285 let mut read_len = CBORReadLen::new(len);
286 read_len.read_elems(2)?;
287 let ret = Self::deserialize_as_embedded_group(raw, len);
288 match len {
289 cbor_event::Len::Len(_) => read_len.finish()?,
290 cbor_event::Len::Indefinite => match raw.special()? {
291 CBORSpecial::Break => (),
292 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
293 },
294 }
295 ret
296 })()
297 .map_err(|e| e.annotate("ScriptAny"))
298 }
299}
300
301impl DeserializeEmbeddedGroup for ScriptAny {
302 fn deserialize_as_embedded_group<R: BufRead + Seek>(
303 raw: &mut Deserializer<R>,
304 _: cbor_event::Len,
305 ) -> Result<Self, DeserializeError> {
306 (|| -> Result<_, DeserializeError> {
307 let index_0_value = raw.unsigned_integer()?;
308 if index_0_value != 2 {
309 return Err(DeserializeFailure::FixedValueMismatch {
310 found: Key::Uint(index_0_value),
311 expected: Key::Uint(2),
312 }
313 .into());
314 }
315 Ok(())
316 })()
317 .map_err(|e| e.annotate("index_0"))?;
318 let native_scripts =
319 (|| -> Result<_, DeserializeError> { Ok(NativeScripts::deserialize(raw)?) })()
320 .map_err(|e| e.annotate("native_scripts"))?;
321 Ok(ScriptAny { native_scripts })
322 }
323}
324
325impl cbor_event::se::Serialize for ScriptNOfK {
326 fn serialize<'se, W: Write>(
327 &self,
328 serializer: &'se mut Serializer<W>,
329 ) -> cbor_event::Result<&'se mut Serializer<W>> {
330 serializer.write_array(cbor_event::Len::Len(3))?;
331 self.serialize_as_embedded_group(serializer)
332 }
333}
334
335impl SerializeEmbeddedGroup for ScriptNOfK {
336 fn serialize_as_embedded_group<'se, W: Write>(
337 &self,
338 serializer: &'se mut Serializer<W>,
339 ) -> cbor_event::Result<&'se mut Serializer<W>> {
340 serializer.write_unsigned_integer(3u64)?;
341 self.n.serialize(serializer)?;
342 self.native_scripts.serialize(serializer)?;
343 Ok(serializer)
344 }
345}
346
347impl Deserialize for ScriptNOfK {
348 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
349 (|| -> Result<_, DeserializeError> {
350 let len = raw.array()?;
351 let mut read_len = CBORReadLen::new(len);
352 read_len.read_elems(3)?;
353 let ret = Self::deserialize_as_embedded_group(raw, len);
354 match len {
355 cbor_event::Len::Len(_) => read_len.finish()?,
356 cbor_event::Len::Indefinite => match raw.special()? {
357 CBORSpecial::Break => (),
358 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
359 },
360 }
361 ret
362 })()
363 .map_err(|e| e.annotate("ScriptNOfK"))
364 }
365}
366
367impl DeserializeEmbeddedGroup for ScriptNOfK {
368 fn deserialize_as_embedded_group<R: BufRead + Seek>(
369 raw: &mut Deserializer<R>,
370 _: cbor_event::Len,
371 ) -> Result<Self, DeserializeError> {
372 (|| -> Result<_, DeserializeError> {
373 let index_0_value = raw.unsigned_integer()?;
374 if index_0_value != 3 {
375 return Err(DeserializeFailure::FixedValueMismatch {
376 found: Key::Uint(index_0_value),
377 expected: Key::Uint(3),
378 }
379 .into());
380 }
381 Ok(())
382 })()
383 .map_err(|e| e.annotate("index_0"))?;
384 let n = (|| -> Result<_, DeserializeError> { Ok(u32::deserialize(raw)?) })()
385 .map_err(|e| e.annotate("n"))?;
386 let native_scripts =
387 (|| -> Result<_, DeserializeError> { Ok(NativeScripts::deserialize(raw)?) })()
388 .map_err(|e| e.annotate("native_scripts"))?;
389 Ok(ScriptNOfK { n, native_scripts })
390 }
391}
392
393impl cbor_event::se::Serialize for TimelockStart {
394 fn serialize<'se, W: Write>(
395 &self,
396 serializer: &'se mut Serializer<W>,
397 ) -> cbor_event::Result<&'se mut Serializer<W>> {
398 serializer.write_array(cbor_event::Len::Len(2))?;
399 self.serialize_as_embedded_group(serializer)
400 }
401}
402
403impl SerializeEmbeddedGroup for TimelockStart {
404 fn serialize_as_embedded_group<'se, W: Write>(
405 &self,
406 serializer: &'se mut Serializer<W>,
407 ) -> cbor_event::Result<&'se mut Serializer<W>> {
408 serializer.write_unsigned_integer(4u64)?;
409 self.slot.serialize(serializer)?;
410 Ok(serializer)
411 }
412}
413
414impl Deserialize for TimelockStart {
415 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
416 (|| -> Result<_, DeserializeError> {
417 let len = raw.array()?;
418 let mut read_len = CBORReadLen::new(len);
419 read_len.read_elems(2)?;
420 let ret = Self::deserialize_as_embedded_group(raw, len);
421 match len {
422 cbor_event::Len::Len(_) => read_len.finish()?,
423 cbor_event::Len::Indefinite => match raw.special()? {
424 CBORSpecial::Break => (),
425 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
426 },
427 }
428 ret
429 })()
430 .map_err(|e| e.annotate("TimelockStart"))
431 }
432}
433
434impl DeserializeEmbeddedGroup for TimelockStart {
435 fn deserialize_as_embedded_group<R: BufRead + Seek>(
436 raw: &mut Deserializer<R>,
437 _: cbor_event::Len,
438 ) -> Result<Self, DeserializeError> {
439 (|| -> Result<_, DeserializeError> {
440 let index_0_value = raw.unsigned_integer()?;
441 if index_0_value != 4 {
442 return Err(DeserializeFailure::FixedValueMismatch {
443 found: Key::Uint(index_0_value),
444 expected: Key::Uint(4),
445 }
446 .into());
447 }
448 Ok(())
449 })()
450 .map_err(|e| e.annotate("index_0"))?;
451 let slot = (|| -> Result<_, DeserializeError> { Ok(SlotBigNum::deserialize(raw)?) })()
452 .map_err(|e| e.annotate("slot"))?;
453 Ok(TimelockStart { slot })
454 }
455}
456
457impl cbor_event::se::Serialize for TimelockExpiry {
458 fn serialize<'se, W: Write>(
459 &self,
460 serializer: &'se mut Serializer<W>,
461 ) -> cbor_event::Result<&'se mut Serializer<W>> {
462 serializer.write_array(cbor_event::Len::Len(2))?;
463 self.serialize_as_embedded_group(serializer)
464 }
465}
466
467impl SerializeEmbeddedGroup for TimelockExpiry {
468 fn serialize_as_embedded_group<'se, W: Write>(
469 &self,
470 serializer: &'se mut Serializer<W>,
471 ) -> cbor_event::Result<&'se mut Serializer<W>> {
472 serializer.write_unsigned_integer(5u64)?;
473 self.slot.serialize(serializer)?;
474 Ok(serializer)
475 }
476}
477
478impl Deserialize for TimelockExpiry {
479 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
480 (|| -> Result<_, DeserializeError> {
481 let len = raw.array()?;
482 let mut read_len = CBORReadLen::new(len);
483 read_len.read_elems(2)?;
484 let ret = Self::deserialize_as_embedded_group(raw, len);
485 match len {
486 cbor_event::Len::Len(_) => read_len.finish()?,
487 cbor_event::Len::Indefinite => match raw.special()? {
488 CBORSpecial::Break => (),
489 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
490 },
491 }
492 ret
493 })()
494 .map_err(|e| e.annotate("TimelockExpiry"))
495 }
496}
497
498impl DeserializeEmbeddedGroup for TimelockExpiry {
499 fn deserialize_as_embedded_group<R: BufRead + Seek>(
500 raw: &mut Deserializer<R>,
501 _: cbor_event::Len,
502 ) -> Result<Self, DeserializeError> {
503 (|| -> Result<_, DeserializeError> {
504 let index_0_value = raw.unsigned_integer()?;
505 if index_0_value != 5 {
506 return Err(DeserializeFailure::FixedValueMismatch {
507 found: Key::Uint(index_0_value),
508 expected: Key::Uint(5),
509 }
510 .into());
511 }
512 Ok(())
513 })()
514 .map_err(|e| e.annotate("index_0"))?;
515 let slot = (|| -> Result<_, DeserializeError> { Ok(SlotBigNum::deserialize(raw)?) })()
516 .map_err(|e| e.annotate("slot"))?;
517 Ok(TimelockExpiry { slot })
518 }
519}