Skip to main content

cardano_serialization_lib/serialization/
general.rs

1use crate::*;
2use std::io::{Seek, SeekFrom};
3use crate::serialization::utils::is_break_tag;
4use hashlink::LinkedHashMap;
5
6// This file was code-generated using an experimental CDDL to rust tool:
7// https://github.com/Emurgo/cddl-codegen
8
9impl cbor_event::se::Serialize for UnitInterval {
10    fn serialize<'se, W: Write>(
11        &self,
12        serializer: &'se mut Serializer<W>,
13    ) -> cbor_event::Result<&'se mut Serializer<W>> {
14        serializer.write_tag(30u64)?;
15        serializer.write_array(cbor_event::Len::Len(2))?;
16        self.numerator.serialize(serializer)?;
17        self.denominator.serialize(serializer)?;
18        Ok(serializer)
19    }
20}
21
22impl Deserialize for UnitInterval {
23    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
24        (|| -> Result<_, DeserializeError> {
25            let tag = raw.tag()?;
26            if tag != 30 {
27                return Err(DeserializeError::new(
28                    "UnitInterval",
29                    DeserializeFailure::TagMismatch {
30                        found: tag,
31                        expected: 30,
32                    },
33                ));
34            }
35            let len = raw.array()?;
36            let ret = Self::deserialize_as_embedded_group(raw, len);
37            match len {
38                cbor_event::Len::Len(_) =>
39                /* TODO: check finite len somewhere */
40                {
41                    ()
42                }
43                cbor_event::Len::Indefinite => match raw.special()? {
44                    CBORSpecial::Break =>
45                    /* it's ok */
46                    {
47                        ()
48                    }
49                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
50                },
51            }
52            ret
53        })()
54        .map_err(|e| e.annotate("UnitInterval"))
55    }
56}
57
58impl DeserializeEmbeddedGroup for UnitInterval {
59    fn deserialize_as_embedded_group<R: BufRead + Seek>(
60        raw: &mut Deserializer<R>,
61        _: cbor_event::Len,
62    ) -> Result<Self, DeserializeError> {
63        let numerator = (|| -> Result<_, DeserializeError> { Ok(BigNum::deserialize(raw)?) })()
64            .map_err(|e| e.annotate("numerator"))?;
65        let denominator = (|| -> Result<_, DeserializeError> { Ok(BigNum::deserialize(raw)?) })()
66            .map_err(|e| e.annotate("denominator"))?;
67        Ok(UnitInterval {
68            numerator,
69            denominator,
70        })
71    }
72}
73
74impl cbor_event::se::Serialize for Transaction {
75    fn serialize<'se, W: Write>(
76        &self,
77        serializer: &'se mut Serializer<W>,
78    ) -> cbor_event::Result<&'se mut Serializer<W>> {
79        serializer.write_array(cbor_event::Len::Len(4))?;
80        self.body.serialize(serializer)?;
81        self.witness_set.serialize(serializer)?;
82        serializer.write_special(CBORSpecial::Bool(self.is_valid))?;
83        match &self.auxiliary_data {
84            Some(x) => x.serialize(serializer),
85            None => serializer.write_special(CBORSpecial::Null),
86        }?;
87        Ok(serializer)
88    }
89}
90
91impl Deserialize for Transaction {
92    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
93        (|| -> Result<_, DeserializeError> {
94            let len = raw.array()?;
95            let ret = Self::deserialize_as_embedded_group(raw, len);
96            match len {
97                cbor_event::Len::Len(_) =>
98                /* TODO: check finite len somewhere */
99                {
100                    ()
101                }
102                cbor_event::Len::Indefinite => match raw.special()? {
103                    CBORSpecial::Break =>
104                    /* it's ok */
105                    {
106                        ()
107                    }
108                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
109                },
110            }
111            ret
112        })()
113        .map_err(|e| e.annotate("Transaction"))
114    }
115}
116
117impl DeserializeEmbeddedGroup for Transaction {
118    fn deserialize_as_embedded_group<R: BufRead + Seek>(
119        raw: &mut Deserializer<R>,
120        _: cbor_event::Len,
121    ) -> Result<Self, DeserializeError> {
122        let body = (|| -> Result<_, DeserializeError> { Ok(TransactionBody::deserialize(raw)?) })()
123            .map_err(|e| e.annotate("body"))?;
124        let witness_set =
125            (|| -> Result<_, DeserializeError> { Ok(TransactionWitnessSet::deserialize(raw)?) })()
126                .map_err(|e| e.annotate("witness_set"))?;
127        let mut checked_auxiliary_data = false;
128        let mut auxiliary_data = None;
129        let is_valid = (|| -> Result<_, DeserializeError> {
130            match raw.cbor_type()? == CBORType::Special {
131                true => {
132                    // if it's special it can be either a bool or null. if it's null, then it's empty auxiliary data, otherwise not a valid encoding
133                    let special = raw.special()?;
134                    if let CBORSpecial::Bool(b) = special {
135                        return Ok(b);
136                    } else if special == CBORSpecial::Null {
137                        checked_auxiliary_data = true;
138                        return Ok(true);
139                    } else {
140                        return Err(DeserializeFailure::ExpectedBool.into());
141                    }
142                }
143                false => {
144                    // if no special symbol was detected, it must have auxiliary data
145                    auxiliary_data = (|| -> Result<_, DeserializeError> {
146                        Ok(Some(AuxiliaryData::deserialize(raw)?))
147                    })()
148                    .map_err(|e| e.annotate("auxiliary_data"))?;
149                    checked_auxiliary_data = true;
150                    return Ok(true);
151                }
152            }
153        })()
154        .map_err(|e| e.annotate("is_valid"))?;
155        if !checked_auxiliary_data {
156            // this branch is reached, if the 3rd argument was a bool. then it simply follows the rules for checking auxiliary data
157            auxiliary_data = (|| -> Result<_, DeserializeError> {
158                Ok(match raw.cbor_type()? != CBORType::Special {
159                    true => Some(AuxiliaryData::deserialize(raw)?),
160                    false => {
161                        if raw.special()? != CBORSpecial::Null {
162                            return Err(DeserializeFailure::ExpectedNull.into());
163                        }
164                        None
165                    }
166                })
167            })()
168            .map_err(|e| e.annotate("auxiliary_data"))?;
169        }
170        Ok(Transaction {
171            body,
172            witness_set,
173            is_valid,
174            auxiliary_data,
175        })
176    }
177}
178
179impl cbor_event::se::Serialize for TransactionOutputs {
180    fn serialize<'se, W: Write>(
181        &self,
182        serializer: &'se mut Serializer<W>,
183    ) -> cbor_event::Result<&'se mut Serializer<W>> {
184        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
185        for element in &self.0 {
186            element.serialize(serializer)?;
187        }
188        Ok(serializer)
189    }
190}
191
192impl Deserialize for TransactionOutputs {
193    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
194        let mut arr = Vec::new();
195        (|| -> Result<_, DeserializeError> {
196            let len = raw.array()?;
197            while match len {
198                cbor_event::Len::Len(n) => arr.len() < n as usize,
199                cbor_event::Len::Indefinite => true,
200            } {
201                if is_break_tag(raw, "TransactionOutputs")? {
202                    break;
203                }
204                arr.push(TransactionOutput::deserialize(raw)?);
205            }
206            Ok(())
207        })()
208        .map_err(|e| e.annotate("TransactionOutputs"))?;
209        Ok(Self(arr))
210    }
211}
212
213impl cbor_event::se::Serialize for TransactionOutput {
214    fn serialize<'se, W: Write>(
215        &self,
216        serializer: &'se mut Serializer<W>,
217    ) -> cbor_event::Result<&'se mut Serializer<W>> {
218        if self.has_plutus_data() || self.has_script_ref() {
219            //post alonzo output
220            let map_len = 2 + opt64(&self.plutus_data) + opt64(&self.script_ref);
221            serializer.write_map(cbor_event::Len::Len(map_len))?;
222            serializer.write_unsigned_integer(0)?;
223            self.address.serialize(serializer)?;
224            serializer.write_unsigned_integer(1)?;
225            self.amount.serialize(serializer)?;
226            if let Some(field) = &self.plutus_data {
227                serializer.write_unsigned_integer(2)?;
228                field.serialize(serializer)?;
229            }
230            if let Some(field) = &self.script_ref {
231                serializer.write_unsigned_integer(3)?;
232                field.serialize(serializer)?;
233            }
234        } else {
235            //lagacy output
236            let data_hash = &self.data_hash();
237            serializer.write_array(cbor_event::Len::Len(2 + opt64(&data_hash)))?;
238            self.address.serialize(serializer)?;
239            self.amount.serialize(serializer)?;
240            if let Some(pure_data_hash) = data_hash {
241                pure_data_hash.serialize(serializer)?;
242            }
243        }
244        Ok(serializer)
245    }
246}
247
248// this is used when deserializing it on its own, but the more likely case
249// is when it's done via TransactionOutputs
250impl Deserialize for TransactionOutput {
251    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
252        (|| -> Result<_, DeserializeError> {
253            match raw.cbor_type()? {
254                CBORType::Array => {
255                    let len = raw.array()?;
256                    let ret = Self::deserialize_as_embedded_group(raw, len);
257                    match len {
258                        cbor_event::Len::Len(_) =>
259                        /* TODO: check finite len somewhere */
260                        {
261                            ()
262                        }
263                        cbor_event::Len::Indefinite => match raw.special()? {
264                            CBORSpecial::Break =>
265                            /* it's ok */
266                            {
267                                ()
268                            }
269                            _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
270                        },
271                    }
272                    ret
273                }
274                CBORType::Map => deserialize_as_postalonzo_output(raw),
275                cbor_type => Err(DeserializeFailure::UnexpectedKeyType(cbor_type).into()),
276            }
277        })()
278        .map_err(|e| e.annotate("TransactionOutput"))
279    }
280}
281
282// this is used by both TransactionOutput (on its own)'s deserialize
283// but also for TransactionOutputs
284// This implementation was hand-coded since cddl-codegen doesn't support deserialization
285// with array-encoded types with optional fields, due to the complexity.
286// This is made worse as this is a plain group...
287impl DeserializeEmbeddedGroup for TransactionOutput {
288    fn deserialize_as_embedded_group<R: BufRead + Seek>(
289        raw: &mut Deserializer<R>,
290        _: cbor_event::Len,
291    ) -> Result<Self, DeserializeError> {
292        let address = (|| -> Result<_, DeserializeError> { Ok(Address::deserialize(raw)?) })()
293            .map_err(|e| e.annotate("address"))?;
294        let amount = (|| -> Result<_, DeserializeError> { Ok(Value::deserialize(raw)?) })()
295            .map_err(|e| e.annotate("amount"))?;
296        // there are only two cases so far where this is used:
297        // 1) on its own inside of TransactionOutput's Deserialize trait (only used if someone calls to_bytes() on it)
298        // 2) from TransactionOutput's deserialization
299        // in 1) we would encounter an array-end (or track it for definite deserialization - which we don't do right now)
300        // and in 2) we would encounter the same OR we would encounter the next TransactionOutput in the array
301        // Unfortunately, both address and data hash are bytes type, so we can't just check the type, but instead
302        // must check the length, and backtrack if that wasn't the case.
303        let data_hash = match raw.cbor_type() {
304            Ok(cbor_event::Type::Bytes) => {
305                let initial_position = raw.as_mut_ref().seek(SeekFrom::Current(0)).unwrap();
306                let bytes = raw.bytes().unwrap();
307                if bytes.len() == DataHash::BYTE_COUNT {
308                    Some(DataOption::DataHash(DataHash(bytes[..DataHash::BYTE_COUNT].try_into().unwrap())))
309                } else {
310                    // This is an address of the next output in sequence, which luckily is > 32 bytes so there's no confusion
311                    // Go to previous place in array then carry on
312                    raw.as_mut_ref().seek(SeekFrom::Start(initial_position)).unwrap();
313                    None
314                }
315            },
316            // not possibly a data hash
317            Ok(_) |
318            // end of input
319            Err(_) => None,
320        };
321        Ok(TransactionOutput {
322            address,
323            amount,
324            plutus_data: data_hash,
325            script_ref: None,
326            serialization_format: Some(CborContainerType::Array),
327        })
328    }
329}
330
331fn deserialize_as_postalonzo_output<R: BufRead + Seek>(
332    raw: &mut Deserializer<R>,
333) -> Result<TransactionOutput, DeserializeError> {
334    (|| -> Result<_, DeserializeError> {
335        let len = raw.map()?;
336        let mut read_len = CBORReadLen::new(len);
337        let mut address = None;
338        let mut amount = None;
339        let mut data = None;
340        let mut script_ref = None;
341        let mut read = 0;
342        while match len {
343            cbor_event::Len::Len(n) => read < n as usize,
344            cbor_event::Len::Indefinite => true,
345        } {
346            if let cbor_event::Len::Indefinite = len {
347                if is_break_tag(raw, "post-alonzo output map")? {
348                    break;
349                }
350            }
351            match raw.cbor_type()? {
352                CBORType::UnsignedInteger => match raw.unsigned_integer()? {
353                    0 => {
354                        if address.is_some() {
355                            return Err(DeserializeFailure::DuplicateKey(Key::Uint(0)).into());
356                        }
357                        address = Some(
358                            (|| -> Result<_, DeserializeError> {
359                                read_len.read_elems(1)?;
360                                Ok(Address::deserialize(raw)?)
361                            })()
362                            .map_err(|e| e.annotate("address"))?,
363                        );
364                    }
365                    1 => {
366                        if amount.is_some() {
367                            return Err(DeserializeFailure::DuplicateKey(Key::Uint(1)).into());
368                        }
369                        amount = Some(
370                            (|| -> Result<_, DeserializeError> {
371                                read_len.read_elems(1)?;
372                                Ok(Value::deserialize(raw)?)
373                            })()
374                            .map_err(|e| e.annotate("amount"))?,
375                        );
376                    }
377                    2 => {
378                        if data.is_some() {
379                            return Err(DeserializeFailure::DuplicateKey(Key::Uint(2)).into());
380                        }
381                        data = Some(
382                            (|| -> Result<_, DeserializeError> {
383                                read_len.read_elems(1)?;
384                                Ok(DataOption::deserialize(raw)?)
385                            })()
386                            .map_err(|e| e.annotate("data"))?,
387                        );
388                    }
389                    3 => {
390                        if script_ref.is_some() {
391                            return Err(DeserializeFailure::DuplicateKey(Key::Uint(3)).into());
392                        }
393                        script_ref = Some(
394                            (|| -> Result<_, DeserializeError> {
395                                read_len.read_elems(1)?;
396                                Ok(ScriptRef::deserialize(raw)?)
397                            })()
398                            .map_err(|e| e.annotate("script_ref"))?,
399                        );
400                    }
401                    unknown_key => {
402                        return Err(DeserializeFailure::UnknownKey(Key::Uint(unknown_key)).into())
403                    }
404                },
405                other_type => return Err(DeserializeFailure::UnexpectedKeyType(other_type).into()),
406            }
407            read += 1;
408        }
409        let address = match address {
410            Some(x) => x,
411            None => return Err(DeserializeFailure::MandatoryFieldMissing(Key::Uint(0)).into()),
412        };
413        let amount = match amount {
414            Some(x) => x,
415            None => return Err(DeserializeFailure::MandatoryFieldMissing(Key::Uint(1)).into()),
416        };
417
418        read_len.finish()?;
419        Ok(TransactionOutput {
420            address,
421            amount,
422            plutus_data: data,
423            script_ref,
424            serialization_format: Some(CborContainerType::Map),
425        })
426    })()
427    .map_err(|e| e.annotate("TransactionOutput"))
428}
429
430impl Deserialize for DataOption {
431    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
432        (|| -> Result<_, DeserializeError> {
433            let len = raw.array()?;
434            if let cbor_event::Len::Len(n) = len {
435                if n != 2 {
436                    return Err(DeserializeFailure::CBOR(cbor_event::Error::WrongLen(
437                        2,
438                        len,
439                        "[id, datum_or_hash]",
440                    ))
441                    .into());
442                }
443            }
444            let datum = match raw.unsigned_integer()? {
445                0 => DataOption::DataHash(DataHash::deserialize(raw)?),
446                1 => {
447                    match raw.tag()? {
448                        //bytes string tag
449                        24 => {
450                            let data = (|| -> Result<_, DeserializeError> {
451                                Ok(from_bytes(&raw.bytes()?)?)
452                            })()
453                            .map_err(|e| e.annotate("PlutusData"))?;
454                            DataOption::Data(data)
455                        }
456                        tag => {
457                            return Err(DeserializeFailure::TagMismatch {
458                                found: tag,
459                                expected: 24,
460                            }
461                            .into());
462                        }
463                    }
464                }
465                n => {
466                    return Err(DeserializeFailure::FixedValueMismatch {
467                        found: Key::Uint(n),
468                        expected: Key::Uint(0),
469                    }
470                    .into())
471                }
472            };
473            if let cbor_event::Len::Indefinite = len {
474                if raw.special()? != CBORSpecial::Break {
475                    return Err(DeserializeFailure::EndingBreakMissing.into());
476                }
477            }
478            Ok(datum)
479        })()
480        .map_err(|e| e.annotate("DataOption"))
481    }
482}
483
484impl cbor_event::se::Serialize for DataOption {
485    fn serialize<'a, W: Write + Sized>(
486        &self,
487        serializer: &'a mut Serializer<W>,
488    ) -> cbor_event::Result<&'a mut Serializer<W>> {
489        serializer.write_array(cbor_event::Len::Len(2))?;
490        match &self {
491            DataOption::DataHash(data_hash) => {
492                serializer.write_unsigned_integer(0)?;
493                data_hash.serialize(serializer)?;
494            }
495            DataOption::Data(data) => {
496                serializer.write_unsigned_integer(1)?;
497                let bytes = data.to_bytes();
498                serializer.write_tag(24)?.write_bytes(&bytes)?;
499            }
500        }
501        Ok(serializer)
502    }
503}
504
505impl cbor_event::se::Serialize for Ipv4 {
506    fn serialize<'se, W: Write>(
507        &self,
508        serializer: &'se mut Serializer<W>,
509    ) -> cbor_event::Result<&'se mut Serializer<W>> {
510        serializer.write_bytes(&self.0)
511    }
512}
513
514impl Deserialize for Ipv4 {
515    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
516        Self::new_impl(raw.bytes()?)
517    }
518}
519
520impl cbor_event::se::Serialize for Ipv6 {
521    fn serialize<'se, W: Write>(
522        &self,
523        serializer: &'se mut Serializer<W>,
524    ) -> cbor_event::Result<&'se mut Serializer<W>> {
525        serializer.write_bytes(&self.0)
526    }
527}
528
529impl Deserialize for Ipv6 {
530    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
531        Self::new_impl(raw.bytes()?)
532    }
533}
534
535impl cbor_event::se::Serialize for DNSRecordAorAAAA {
536    fn serialize<'se, W: Write>(
537        &self,
538        serializer: &'se mut Serializer<W>,
539    ) -> cbor_event::Result<&'se mut Serializer<W>> {
540        serializer.write_text(&self.0)
541    }
542}
543
544impl Deserialize for DNSRecordAorAAAA {
545    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
546        Self::new_impl(raw.text()?)
547    }
548}
549
550impl cbor_event::se::Serialize for DNSRecordSRV {
551    fn serialize<'se, W: Write>(
552        &self,
553        serializer: &'se mut Serializer<W>,
554    ) -> cbor_event::Result<&'se mut Serializer<W>> {
555        serializer.write_text(&self.0)
556    }
557}
558
559impl Deserialize for DNSRecordSRV {
560    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
561        Self::new_impl(raw.text()?)
562    }
563}
564
565impl cbor_event::se::Serialize for URL {
566    fn serialize<'se, W: Write>(
567        &self,
568        serializer: &'se mut Serializer<W>,
569    ) -> cbor_event::Result<&'se mut Serializer<W>> {
570        serializer.write_text(&self.0)
571    }
572}
573
574impl Deserialize for URL {
575    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
576        Self::new_impl(raw.text()?)
577    }
578}
579
580impl cbor_event::se::Serialize for SingleHostAddr {
581    fn serialize<'se, W: Write>(
582        &self,
583        serializer: &'se mut Serializer<W>,
584    ) -> cbor_event::Result<&'se mut Serializer<W>> {
585        serializer.write_array(cbor_event::Len::Len(4))?;
586        self.serialize_as_embedded_group(serializer)
587    }
588}
589
590impl SerializeEmbeddedGroup for SingleHostAddr {
591    fn serialize_as_embedded_group<'se, W: Write>(
592        &self,
593        serializer: &'se mut Serializer<W>,
594    ) -> cbor_event::Result<&'se mut Serializer<W>> {
595        serializer.write_unsigned_integer(0u64)?;
596        match &self.port {
597            Some(x) => x.serialize(serializer),
598            None => serializer.write_special(CBORSpecial::Null),
599        }?;
600        match &self.ipv4 {
601            Some(x) => x.serialize(serializer),
602            None => serializer.write_special(CBORSpecial::Null),
603        }?;
604        match &self.ipv6 {
605            Some(x) => x.serialize(serializer),
606            None => serializer.write_special(CBORSpecial::Null),
607        }?;
608        Ok(serializer)
609    }
610}
611
612impl Deserialize for SingleHostAddr {
613    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
614        (|| -> Result<_, DeserializeError> {
615            let len = raw.array()?;
616            let ret = Self::deserialize_as_embedded_group(raw, len);
617            match len {
618                cbor_event::Len::Len(_) =>
619                /* TODO: check finite len somewhere */
620                {
621                    ()
622                }
623                cbor_event::Len::Indefinite => match raw.special()? {
624                    CBORSpecial::Break =>
625                    /* it's ok */
626                    {
627                        ()
628                    }
629                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
630                },
631            }
632            ret
633        })()
634        .map_err(|e| e.annotate("SingleHostAddr"))
635    }
636}
637
638impl DeserializeEmbeddedGroup for SingleHostAddr {
639    fn deserialize_as_embedded_group<R: BufRead + Seek>(
640        raw: &mut Deserializer<R>,
641        _: cbor_event::Len,
642    ) -> Result<Self, DeserializeError> {
643        (|| -> Result<_, DeserializeError> {
644            let index_0_value = raw.unsigned_integer()?;
645            if index_0_value != 0 {
646                return Err(DeserializeFailure::FixedValueMismatch {
647                    found: Key::Uint(index_0_value),
648                    expected: Key::Uint(0),
649                }
650                .into());
651            }
652            Ok(())
653        })()
654        .map_err(|e| e.annotate("index_0"))?;
655        let port = (|| -> Result<_, DeserializeError> {
656            Ok(match raw.cbor_type()? != CBORType::Special {
657                true => Some(Port::deserialize(raw)?),
658                false => {
659                    if raw.special()? != CBORSpecial::Null {
660                        return Err(DeserializeFailure::ExpectedNull.into());
661                    }
662                    None
663                }
664            })
665        })()
666        .map_err(|e| e.annotate("port"))?;
667        let ipv4 = (|| -> Result<_, DeserializeError> {
668            Ok(match raw.cbor_type()? != CBORType::Special {
669                true => Some(Ipv4::deserialize(raw)?),
670                false => {
671                    if raw.special()? != CBORSpecial::Null {
672                        return Err(DeserializeFailure::ExpectedNull.into());
673                    }
674                    None
675                }
676            })
677        })()
678        .map_err(|e| e.annotate("ipv4"))?;
679        let ipv6 = (|| -> Result<_, DeserializeError> {
680            Ok(match raw.cbor_type()? != CBORType::Special {
681                true => Some(Ipv6::deserialize(raw)?),
682                false => {
683                    if raw.special()? != CBORSpecial::Null {
684                        return Err(DeserializeFailure::ExpectedNull.into());
685                    }
686                    None
687                }
688            })
689        })()
690        .map_err(|e| e.annotate("ipv6"))?;
691        Ok(SingleHostAddr { port, ipv4, ipv6 })
692    }
693}
694
695impl cbor_event::se::Serialize for SingleHostName {
696    fn serialize<'se, W: Write>(
697        &self,
698        serializer: &'se mut Serializer<W>,
699    ) -> cbor_event::Result<&'se mut Serializer<W>> {
700        serializer.write_array(cbor_event::Len::Len(3))?;
701        self.serialize_as_embedded_group(serializer)
702    }
703}
704
705impl SerializeEmbeddedGroup for SingleHostName {
706    fn serialize_as_embedded_group<'se, W: Write>(
707        &self,
708        serializer: &'se mut Serializer<W>,
709    ) -> cbor_event::Result<&'se mut Serializer<W>> {
710        serializer.write_unsigned_integer(1u64)?;
711        match &self.port {
712            Some(x) => x.serialize(serializer),
713            None => serializer.write_special(CBORSpecial::Null),
714        }?;
715        self.dns_name.serialize(serializer)?;
716        Ok(serializer)
717    }
718}
719
720impl Deserialize for SingleHostName {
721    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
722        (|| -> Result<_, DeserializeError> {
723            let len = raw.array()?;
724            let ret = Self::deserialize_as_embedded_group(raw, len);
725            match len {
726                cbor_event::Len::Len(_) =>
727                /* TODO: check finite len somewhere */
728                {
729                    ()
730                }
731                cbor_event::Len::Indefinite => match raw.special()? {
732                    CBORSpecial::Break =>
733                    /* it's ok */
734                    {
735                        ()
736                    }
737                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
738                },
739            }
740            ret
741        })()
742        .map_err(|e| e.annotate("SingleHostName"))
743    }
744}
745
746impl DeserializeEmbeddedGroup for SingleHostName {
747    fn deserialize_as_embedded_group<R: BufRead + Seek>(
748        raw: &mut Deserializer<R>,
749        _: cbor_event::Len,
750    ) -> Result<Self, DeserializeError> {
751        (|| -> Result<_, DeserializeError> {
752            let index_0_value = raw.unsigned_integer()?;
753            if index_0_value != 1 {
754                return Err(DeserializeFailure::FixedValueMismatch {
755                    found: Key::Uint(index_0_value),
756                    expected: Key::Uint(1),
757                }
758                .into());
759            }
760            Ok(())
761        })()
762        .map_err(|e| e.annotate("index_0"))?;
763        let port = (|| -> Result<_, DeserializeError> {
764            Ok(match raw.cbor_type()? != CBORType::Special {
765                true => Some(Port::deserialize(raw)?),
766                false => {
767                    if raw.special()? != CBORSpecial::Null {
768                        return Err(DeserializeFailure::ExpectedNull.into());
769                    }
770                    None
771                }
772            })
773        })()
774        .map_err(|e| e.annotate("port"))?;
775        let dns_name =
776            (|| -> Result<_, DeserializeError> { Ok(DNSRecordAorAAAA::deserialize(raw)?) })()
777                .map_err(|e| e.annotate("dns_name"))?;
778        Ok(SingleHostName { port, dns_name })
779    }
780}
781
782impl cbor_event::se::Serialize for MultiHostName {
783    fn serialize<'se, W: Write>(
784        &self,
785        serializer: &'se mut Serializer<W>,
786    ) -> cbor_event::Result<&'se mut Serializer<W>> {
787        serializer.write_array(cbor_event::Len::Len(2))?;
788        self.serialize_as_embedded_group(serializer)
789    }
790}
791
792impl SerializeEmbeddedGroup for MultiHostName {
793    fn serialize_as_embedded_group<'se, W: Write>(
794        &self,
795        serializer: &'se mut Serializer<W>,
796    ) -> cbor_event::Result<&'se mut Serializer<W>> {
797        serializer.write_unsigned_integer(2u64)?;
798        self.dns_name.serialize(serializer)?;
799        Ok(serializer)
800    }
801}
802
803impl Deserialize for MultiHostName {
804    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
805        (|| -> Result<_, DeserializeError> {
806            let len = raw.array()?;
807            let ret = Self::deserialize_as_embedded_group(raw, len);
808            match len {
809                cbor_event::Len::Len(_) =>
810                /* TODO: check finite len somewhere */
811                {
812                    ()
813                }
814                cbor_event::Len::Indefinite => match raw.special()? {
815                    CBORSpecial::Break =>
816                    /* it's ok */
817                    {
818                        ()
819                    }
820                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
821                },
822            }
823            ret
824        })()
825        .map_err(|e| e.annotate("MultiHostName"))
826    }
827}
828
829impl DeserializeEmbeddedGroup for MultiHostName {
830    fn deserialize_as_embedded_group<R: BufRead + Seek>(
831        raw: &mut Deserializer<R>,
832        _: cbor_event::Len,
833    ) -> Result<Self, DeserializeError> {
834        (|| -> Result<_, DeserializeError> {
835            let index_0_value = raw.unsigned_integer()?;
836            if index_0_value != 2 {
837                return Err(DeserializeFailure::FixedValueMismatch {
838                    found: Key::Uint(index_0_value),
839                    expected: Key::Uint(2),
840                }
841                .into());
842            }
843            Ok(())
844        })()
845        .map_err(|e| e.annotate("index_0"))?;
846        let dns_name =
847            (|| -> Result<_, DeserializeError> { Ok(DNSRecordSRV::deserialize(raw)?) })()
848                .map_err(|e| e.annotate("dns_name"))?;
849        Ok(MultiHostName { dns_name })
850    }
851}
852
853impl cbor_event::se::Serialize for RelayEnum {
854    fn serialize<'se, W: Write>(
855        &self,
856        serializer: &'se mut Serializer<W>,
857    ) -> cbor_event::Result<&'se mut Serializer<W>> {
858        match self {
859            RelayEnum::SingleHostAddr(x) => x.serialize(serializer),
860            RelayEnum::SingleHostName(x) => x.serialize(serializer),
861            RelayEnum::MultiHostName(x) => x.serialize(serializer),
862        }
863    }
864}
865
866impl Deserialize for RelayEnum {
867    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
868        (|| -> Result<_, DeserializeError> {
869            let len = raw.array()?;
870            let ret = Self::deserialize_as_embedded_group(raw, len);
871            match len {
872                cbor_event::Len::Len(_) =>
873                /* TODO: check finite len somewhere */
874                {
875                    ()
876                }
877                cbor_event::Len::Indefinite => match raw.special()? {
878                    CBORSpecial::Break =>
879                    /* it's ok */
880                    {
881                        ()
882                    }
883                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
884                },
885            }
886            ret
887        })()
888        .map_err(|e| e.annotate("RelayEnum"))
889    }
890}
891
892impl DeserializeEmbeddedGroup for RelayEnum {
893    fn deserialize_as_embedded_group<R: BufRead + Seek>(
894        raw: &mut Deserializer<R>,
895        len: cbor_event::Len,
896    ) -> Result<Self, DeserializeError> {
897        let initial_position = raw.as_mut_ref().seek(SeekFrom::Current(0)).unwrap();
898        match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
899            Ok(SingleHostAddr::deserialize_as_embedded_group(raw, len)?)
900        })(raw)
901        {
902            Ok(variant) => return Ok(RelayEnum::SingleHostAddr(variant)),
903            Err(_) => raw
904                .as_mut_ref()
905                .seek(SeekFrom::Start(initial_position))
906                .unwrap(),
907        };
908        match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
909            Ok(SingleHostName::deserialize_as_embedded_group(raw, len)?)
910        })(raw)
911        {
912            Ok(variant) => return Ok(RelayEnum::SingleHostName(variant)),
913            Err(_) => raw
914                .as_mut_ref()
915                .seek(SeekFrom::Start(initial_position))
916                .unwrap(),
917        };
918        match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
919            Ok(MultiHostName::deserialize_as_embedded_group(raw, len)?)
920        })(raw)
921        {
922            Ok(variant) => return Ok(RelayEnum::MultiHostName(variant)),
923            Err(_) => raw
924                .as_mut_ref()
925                .seek(SeekFrom::Start(initial_position))
926                .unwrap(),
927        };
928        Err(DeserializeError::new(
929            "RelayEnum",
930            DeserializeFailure::NoVariantMatched.into(),
931        ))
932    }
933}
934
935impl cbor_event::se::Serialize for Relay {
936    fn serialize<'se, W: Write>(
937        &self,
938        serializer: &'se mut Serializer<W>,
939    ) -> cbor_event::Result<&'se mut Serializer<W>> {
940        self.0.serialize(serializer)
941    }
942}
943
944impl Deserialize for Relay {
945    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
946        Ok(Self(RelayEnum::deserialize(raw)?))
947    }
948}
949
950impl cbor_event::se::Serialize for PoolMetadata {
951    fn serialize<'se, W: Write>(
952        &self,
953        serializer: &'se mut Serializer<W>,
954    ) -> cbor_event::Result<&'se mut Serializer<W>> {
955        serializer.write_array(cbor_event::Len::Len(2))?;
956        self.url.serialize(serializer)?;
957        self.pool_metadata_hash.serialize(serializer)?;
958        Ok(serializer)
959    }
960}
961
962impl Deserialize for PoolMetadata {
963    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
964        (|| -> Result<_, DeserializeError> {
965            let len = raw.array()?;
966            let ret = Self::deserialize_as_embedded_group(raw, len);
967            match len {
968                cbor_event::Len::Len(_) =>
969                /* TODO: check finite len somewhere */
970                {
971                    ()
972                }
973                cbor_event::Len::Indefinite => match raw.special()? {
974                    CBORSpecial::Break =>
975                    /* it's ok */
976                    {
977                        ()
978                    }
979                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
980                },
981            }
982            ret
983        })()
984        .map_err(|e| e.annotate("PoolMetadata"))
985    }
986}
987
988impl DeserializeEmbeddedGroup for PoolMetadata {
989    fn deserialize_as_embedded_group<R: BufRead + Seek>(
990        raw: &mut Deserializer<R>,
991        _: cbor_event::Len,
992    ) -> Result<Self, DeserializeError> {
993        let url = (|| -> Result<_, DeserializeError> { Ok(URL::deserialize(raw)?) })()
994            .map_err(|e| e.annotate("url"))?;
995        let pool_metadata_hash =
996            (|| -> Result<_, DeserializeError> { Ok(PoolMetadataHash::deserialize(raw)?) })()
997                .map_err(|e| e.annotate("pool_metadata_hash"))?;
998        Ok(PoolMetadata {
999            url,
1000            pool_metadata_hash,
1001        })
1002    }
1003}
1004
1005impl cbor_event::se::Serialize for RewardAddresses {
1006    fn serialize<'se, W: Write>(
1007        &self,
1008        serializer: &'se mut Serializer<W>,
1009    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1010        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
1011        for element in &self.0 {
1012            element.serialize(serializer)?;
1013        }
1014        Ok(serializer)
1015    }
1016}
1017
1018impl Deserialize for RewardAddresses {
1019    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1020        let mut arr = Vec::new();
1021        (|| -> Result<_, DeserializeError> {
1022            let len = raw.array()?;
1023            while match len {
1024                cbor_event::Len::Len(n) => arr.len() < n as usize,
1025                cbor_event::Len::Indefinite => true,
1026            } {
1027                if is_break_tag(raw, "RewardAddresses")? {
1028                    break;
1029                }
1030                arr.push(RewardAddress::deserialize(raw)?);
1031            }
1032            Ok(())
1033        })()
1034        .map_err(|e| e.annotate("RewardAddresses"))?;
1035        Ok(Self(arr))
1036    }
1037}
1038
1039impl cbor_event::se::Serialize for Withdrawals {
1040    fn serialize<'se, W: Write>(
1041        &self,
1042        serializer: &'se mut Serializer<W>,
1043    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1044        serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
1045        for (key, value) in &self.0 {
1046            key.serialize(serializer)?;
1047            value.serialize(serializer)?;
1048        }
1049        Ok(serializer)
1050    }
1051}
1052
1053impl Deserialize for Withdrawals {
1054    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1055        let mut table = LinkedHashMap::new();
1056        (|| -> Result<_, DeserializeError> {
1057            let len = raw.map()?;
1058            while match len {
1059                cbor_event::Len::Len(n) => table.len() < n as usize,
1060                cbor_event::Len::Indefinite => true,
1061            } {
1062                if is_break_tag(raw, "Withdrawals")? {
1063                    break;
1064                }
1065                let key = RewardAddress::deserialize(raw)?;
1066                let value = Coin::deserialize(raw)?;
1067                if table.insert(key.clone(), value).is_some() {
1068                    return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
1069                        "some complicated/unsupported type",
1070                    )))
1071                    .into());
1072                }
1073            }
1074            Ok(())
1075        })()
1076        .map_err(|e| e.annotate("Withdrawals"))?;
1077        Ok(Self(table))
1078    }
1079}
1080
1081impl cbor_event::se::Serialize for Update {
1082    fn serialize<'se, W: Write>(
1083        &self,
1084        serializer: &'se mut Serializer<W>,
1085    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1086        serializer.write_array(cbor_event::Len::Len(2))?;
1087        self.proposed_protocol_parameter_updates
1088            .serialize(serializer)?;
1089        self.epoch.serialize(serializer)?;
1090        Ok(serializer)
1091    }
1092}
1093
1094impl Deserialize for Update {
1095    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1096        (|| -> Result<_, DeserializeError> {
1097            let len = raw.array()?;
1098            let ret = Self::deserialize_as_embedded_group(raw, len);
1099            match len {
1100                cbor_event::Len::Len(_) =>
1101                /* TODO: check finite len somewhere */
1102                {
1103                    ()
1104                }
1105                cbor_event::Len::Indefinite => match raw.special()? {
1106                    CBORSpecial::Break =>
1107                    /* it's ok */
1108                    {
1109                        ()
1110                    }
1111                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
1112                },
1113            }
1114            ret
1115        })()
1116        .map_err(|e| e.annotate("Update"))
1117    }
1118}
1119
1120impl DeserializeEmbeddedGroup for Update {
1121    fn deserialize_as_embedded_group<R: BufRead + Seek>(
1122        raw: &mut Deserializer<R>,
1123        _: cbor_event::Len,
1124    ) -> Result<Self, DeserializeError> {
1125        let proposed_protocol_parameter_updates = (|| -> Result<_, DeserializeError> {
1126            Ok(ProposedProtocolParameterUpdates::deserialize(raw)?)
1127        })()
1128        .map_err(|e| e.annotate("proposed_protocol_parameter_updates"))?;
1129        let epoch = (|| -> Result<_, DeserializeError> { Ok(Epoch::deserialize(raw)?) })()
1130            .map_err(|e| e.annotate("epoch"))?;
1131        Ok(Update {
1132            proposed_protocol_parameter_updates,
1133            epoch,
1134        })
1135    }
1136}
1137
1138impl cbor_event::se::Serialize for GenesisHashes {
1139    fn serialize<'se, W: Write>(
1140        &self,
1141        serializer: &'se mut Serializer<W>,
1142    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1143        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
1144        for element in &self.0 {
1145            element.serialize(serializer)?;
1146        }
1147        Ok(serializer)
1148    }
1149}
1150
1151impl Deserialize for GenesisHashes {
1152    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1153        let mut arr = Vec::new();
1154        (|| -> Result<_, DeserializeError> {
1155            let len = raw.array()?;
1156            while match len {
1157                cbor_event::Len::Len(n) => arr.len() < n as usize,
1158                cbor_event::Len::Indefinite => true,
1159            } {
1160                if is_break_tag(raw, "GenesisHashes")? {
1161                    break;
1162                }
1163                arr.push(GenesisHash::deserialize(raw)?);
1164            }
1165            Ok(())
1166        })()
1167        .map_err(|e| e.annotate("Genesishashes"))?;
1168        Ok(Self(arr))
1169    }
1170}
1171
1172impl cbor_event::se::Serialize for ScriptHashes {
1173    fn serialize<'se, W: Write>(
1174        &self,
1175        serializer: &'se mut Serializer<W>,
1176    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1177        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
1178        for element in &self.0 {
1179            element.serialize(serializer)?;
1180        }
1181        Ok(serializer)
1182    }
1183}
1184
1185impl Deserialize for ScriptHashes {
1186    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1187        let mut arr = Vec::new();
1188        (|| -> Result<_, DeserializeError> {
1189            let len = raw.array()?;
1190            while match len {
1191                cbor_event::Len::Len(n) => arr.len() < n as usize,
1192                cbor_event::Len::Indefinite => true,
1193            } {
1194                if is_break_tag(raw, "ScriptHashes")? {
1195                    break;
1196                }
1197                arr.push(ScriptHash::deserialize(raw)?);
1198            }
1199            Ok(())
1200        })()
1201        .map_err(|e| e.annotate("ScriptHashes"))?;
1202        Ok(Self(arr))
1203    }
1204}
1205
1206impl cbor_event::se::Serialize for ProposedProtocolParameterUpdates {
1207    fn serialize<'se, W: Write>(
1208        &self,
1209        serializer: &'se mut Serializer<W>,
1210    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1211        serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
1212        for (key, value) in &self.0 {
1213            key.serialize(serializer)?;
1214            value.serialize(serializer)?;
1215        }
1216        Ok(serializer)
1217    }
1218}
1219
1220impl Deserialize for ProposedProtocolParameterUpdates {
1221    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1222        let mut table = LinkedHashMap::new();
1223        (|| -> Result<_, DeserializeError> {
1224            let len = raw.map()?;
1225            while match len {
1226                cbor_event::Len::Len(n) => table.len() < n as usize,
1227                cbor_event::Len::Indefinite => true,
1228            } {
1229                if is_break_tag(raw, "ProposedProtocolParameterUpdates")? {
1230                    break;
1231                }
1232                let key = GenesisHash::deserialize(raw)?;
1233                let value = ProtocolParamUpdate::deserialize(raw)?;
1234                if table.insert(key.clone(), value).is_some() {
1235                    return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
1236                        "some complicated/unsupported type",
1237                    )))
1238                    .into());
1239                }
1240            }
1241            Ok(())
1242        })()
1243        .map_err(|e| e.annotate("ProposedProtocolParameterUpdates"))?;
1244        Ok(Self(table))
1245    }
1246}
1247
1248impl cbor_event::se::Serialize for ProtocolVersion {
1249    fn serialize<'se, W: Write>(
1250        &self,
1251        serializer: &'se mut Serializer<W>,
1252    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1253        serializer.write_array(cbor_event::Len::Len(2))?;
1254        self.serialize_as_embedded_group(serializer)
1255    }
1256}
1257
1258impl SerializeEmbeddedGroup for ProtocolVersion {
1259    fn serialize_as_embedded_group<'se, W: Write>(
1260        &self,
1261        serializer: &'se mut Serializer<W>,
1262    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1263        self.major.serialize(serializer)?;
1264        self.minor.serialize(serializer)?;
1265        Ok(serializer)
1266    }
1267}
1268
1269impl Deserialize for ProtocolVersion {
1270    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1271        (|| -> Result<_, DeserializeError> {
1272            let len = raw.array()?;
1273            let ret = Self::deserialize_as_embedded_group(raw, len);
1274            match len {
1275                cbor_event::Len::Len(_) =>
1276                /* TODO: check finite len somewhere */
1277                {
1278                    ()
1279                }
1280                cbor_event::Len::Indefinite => match raw.special()? {
1281                    CBORSpecial::Break =>
1282                    /* it's ok */
1283                    {
1284                        ()
1285                    }
1286                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
1287                },
1288            }
1289            ret
1290        })()
1291        .map_err(|e| e.annotate("ProtocolVersion"))
1292    }
1293}
1294
1295impl DeserializeEmbeddedGroup for ProtocolVersion {
1296    fn deserialize_as_embedded_group<R: BufRead + Seek>(
1297        raw: &mut Deserializer<R>,
1298        _: cbor_event::Len,
1299    ) -> Result<Self, DeserializeError> {
1300        let major = (|| -> Result<_, DeserializeError> { Ok(u32::deserialize(raw)?) })()
1301            .map_err(|e| e.annotate("major"))?;
1302        let minor = (|| -> Result<_, DeserializeError> { Ok(u32::deserialize(raw)?) })()
1303            .map_err(|e| e.annotate("minor"))?;
1304        Ok(ProtocolVersion { major, minor })
1305    }
1306}
1307
1308impl cbor_event::se::Serialize for AuxiliaryDataSet {
1309    fn serialize<'se, W: Write>(
1310        &self,
1311        serializer: &'se mut Serializer<W>,
1312    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1313        serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
1314        for (key, value) in &self.0 {
1315            key.serialize(serializer)?;
1316            value.serialize(serializer)?;
1317        }
1318        Ok(serializer)
1319    }
1320}
1321
1322impl Deserialize for AuxiliaryDataSet {
1323    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1324        let mut table = LinkedHashMap::new();
1325        (|| -> Result<_, DeserializeError> {
1326            let len = raw.map()?;
1327            while match len {
1328                cbor_event::Len::Len(n) => table.len() < n as usize,
1329                cbor_event::Len::Indefinite => true,
1330            } {
1331                if is_break_tag(raw, "AuxiliaryDataSet")? {
1332                    break;
1333                }
1334                let key = TransactionIndex::deserialize(raw)?;
1335                let value = AuxiliaryData::deserialize(raw)?;
1336                if table.insert(key.clone(), value).is_some() {
1337                    return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
1338                        "some complicated/unsupported type",
1339                    )))
1340                    .into());
1341                }
1342            }
1343            Ok(())
1344        })()
1345        .map_err(|e| e.annotate("AuxiliaryDataSet"))?;
1346        Ok(Self(table))
1347    }
1348}
1349
1350impl cbor_event::se::Serialize for AssetName {
1351    fn serialize<'se, W: Write>(
1352        &self,
1353        serializer: &'se mut Serializer<W>,
1354    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1355        serializer.write_bytes(&self.0)
1356    }
1357}
1358
1359impl Deserialize for AssetName {
1360    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1361        Self::new_impl(raw.bytes()?)
1362    }
1363}
1364
1365impl cbor_event::se::Serialize for AssetNames {
1366    fn serialize<'se, W: Write>(
1367        &self,
1368        serializer: &'se mut Serializer<W>,
1369    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1370        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
1371        for element in &self.0 {
1372            element.serialize(serializer)?;
1373        }
1374        Ok(serializer)
1375    }
1376}
1377
1378impl Deserialize for AssetNames {
1379    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1380        let mut arr = Vec::new();
1381        (|| -> Result<_, DeserializeError> {
1382            let len = raw.array()?;
1383            while match len {
1384                cbor_event::Len::Len(n) => arr.len() < n as usize,
1385                cbor_event::Len::Indefinite => true,
1386            } {
1387                if is_break_tag(raw, "AssetNames")? {
1388                    break;
1389                }
1390                arr.push(AssetName::deserialize(raw)?);
1391            }
1392            Ok(())
1393        })()
1394        .map_err(|e| e.annotate("AssetNames"))?;
1395        Ok(Self(arr))
1396    }
1397}
1398
1399impl cbor_event::se::Serialize for Assets {
1400    fn serialize<'se, W: Write>(
1401        &self,
1402        serializer: &'se mut Serializer<W>,
1403    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1404        serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
1405        for (key, value) in &self.0 {
1406            key.serialize(serializer)?;
1407            value.serialize(serializer)?;
1408        }
1409        Ok(serializer)
1410    }
1411}
1412
1413impl Deserialize for Assets {
1414    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1415        let mut table = std::collections::BTreeMap::new();
1416        (|| -> Result<_, DeserializeError> {
1417            let len = raw.map()?;
1418            while match len {
1419                cbor_event::Len::Len(n) => table.len() < n as usize,
1420                cbor_event::Len::Indefinite => true,
1421            } {
1422                if is_break_tag(raw, "Assets")? {
1423                    break;
1424                }
1425                let key = AssetName::deserialize(raw)?;
1426                let value = BigNum::deserialize(raw)?;
1427                if table.insert(key.clone(), value).is_some() {
1428                    return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
1429                        "some complicated/unsupported type",
1430                    )))
1431                    .into());
1432                }
1433            }
1434            Ok(())
1435        })()
1436        .map_err(|e| e.annotate("Assets"))?;
1437        Ok(Self(table))
1438    }
1439}
1440
1441impl cbor_event::se::Serialize for MultiAsset {
1442    fn serialize<'se, W: Write>(
1443        &self,
1444        serializer: &'se mut Serializer<W>,
1445    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1446        serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
1447        for (key, value) in &self.0 {
1448            key.serialize(serializer)?;
1449            value.serialize(serializer)?;
1450        }
1451        Ok(serializer)
1452    }
1453}
1454
1455impl Deserialize for MultiAsset {
1456    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1457        let mut table = std::collections::BTreeMap::new();
1458        (|| -> Result<_, DeserializeError> {
1459            let len = raw.map()?;
1460            while match len {
1461                cbor_event::Len::Len(n) => table.len() < n as usize,
1462                cbor_event::Len::Indefinite => true,
1463            } {
1464                if is_break_tag(raw, "MultiAsset")? {
1465                    break;
1466                }
1467                let key = PolicyID::deserialize(raw)?;
1468                let value = Assets::deserialize(raw)?;
1469                if table.insert(key.clone(), value).is_some() {
1470                    return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
1471                        "some complicated/unsupported type",
1472                    )))
1473                    .into());
1474                }
1475            }
1476            Ok(())
1477        })()
1478        .map_err(|e| e.annotate("MultiAsset"))?;
1479        Ok(Self(table))
1480    }
1481}
1482
1483impl cbor_event::se::Serialize for MintAssets {
1484    fn serialize<'se, W: Write>(
1485        &self,
1486        serializer: &'se mut Serializer<W>,
1487    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1488        serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
1489        for (key, value) in &self.0 {
1490            key.serialize(serializer)?;
1491            value.serialize(serializer)?;
1492        }
1493        Ok(serializer)
1494    }
1495}
1496
1497impl Deserialize for MintAssets {
1498    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1499        let mut table = std::collections::BTreeMap::new();
1500        (|| -> Result<_, DeserializeError> {
1501            let len = raw.map()?;
1502            while match len {
1503                cbor_event::Len::Len(n) => table.len() < n as usize,
1504                cbor_event::Len::Indefinite => true,
1505            } {
1506                if is_break_tag(raw, "MintAssets")? {
1507                    break;
1508                }
1509                let key = AssetName::deserialize(raw)?;
1510                let value = Int::deserialize(raw)?;
1511                if table.insert(key.clone(), value).is_some() {
1512                    return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
1513                        "some complicated/unsupported type",
1514                    )))
1515                    .into());
1516                }
1517            }
1518            Ok(())
1519        })()
1520        .map_err(|e| e.annotate("MintAssets"))?;
1521        Ok(Self(table))
1522    }
1523}
1524
1525impl cbor_event::se::Serialize for Mint {
1526    fn serialize<'se, W: Write>(
1527        &self,
1528        serializer: &'se mut Serializer<W>,
1529    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1530        serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
1531        for (key, value) in &self.0 {
1532            key.serialize(serializer)?;
1533            value.serialize(serializer)?;
1534        }
1535        Ok(serializer)
1536    }
1537}
1538
1539impl Deserialize for Mint {
1540    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1541        let mut mints = Vec::new();
1542        (|| -> Result<_, DeserializeError> {
1543            let len = raw.map()?;
1544            while match len {
1545                cbor_event::Len::Len(n) => mints.len() < n as usize,
1546                cbor_event::Len::Indefinite => true,
1547            } {
1548                if is_break_tag(raw, "Mint")? {
1549                    break;
1550                }
1551                let key = PolicyID::deserialize(raw)?;
1552                let value = MintAssets::deserialize(raw)?;
1553                mints.push((key.clone(), value));
1554            }
1555            Ok(())
1556        })()
1557        .map_err(|e| e.annotate("Mint"))?;
1558        Ok(Self(mints))
1559    }
1560}
1561
1562impl cbor_event::se::Serialize for NetworkId {
1563    fn serialize<'se, W: Write>(
1564        &self,
1565        serializer: &'se mut Serializer<W>,
1566    ) -> cbor_event::Result<&'se mut Serializer<W>> {
1567        match self.0 {
1568            NetworkIdKind::Testnet => serializer.write_unsigned_integer(0u64),
1569            NetworkIdKind::Mainnet => serializer.write_unsigned_integer(1u64),
1570        }
1571    }
1572}
1573
1574impl Deserialize for NetworkId {
1575    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1576        (|| -> Result<_, DeserializeError> {
1577            match raw.unsigned_integer()? {
1578                0 => Ok(NetworkId::testnet()),
1579                1 => Ok(NetworkId::mainnet()),
1580                _ => Err(DeserializeError::new(
1581                    "NetworkId",
1582                    DeserializeFailure::NoVariantMatched.into(),
1583                )),
1584            }
1585        })()
1586        .map_err(|e| e.annotate("NetworkId"))
1587    }
1588}