Skip to main content

nwnrs_nwscript/
ndb.rs

1use std::{
2    error::Error,
3    fmt,
4    io::{self, BufRead, Write},
5};
6
7use nwnrs_types::io::prelude::*;
8use serde::{Deserialize, Serialize};
9
10/// A type abbreviation used in an `NDB V1.0` file.
11#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbType {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            NdbType::Float => ::core::fmt::Formatter::write_str(f, "Float"),
            NdbType::Int => ::core::fmt::Formatter::write_str(f, "Int"),
            NdbType::Void => ::core::fmt::Formatter::write_str(f, "Void"),
            NdbType::Object => ::core::fmt::Formatter::write_str(f, "Object"),
            NdbType::String => ::core::fmt::Formatter::write_str(f, "String"),
            NdbType::EngineStructure(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "EngineStructure", &__self_0),
            NdbType::Struct(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Struct",
                    &__self_0),
            NdbType::Unknown =>
                ::core::fmt::Formatter::write_str(f, "Unknown"),
            NdbType::Raw(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Raw",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NdbType {
    #[inline]
    fn clone(&self) -> NdbType {
        match self {
            NdbType::Float => NdbType::Float,
            NdbType::Int => NdbType::Int,
            NdbType::Void => NdbType::Void,
            NdbType::Object => NdbType::Object,
            NdbType::String => NdbType::String,
            NdbType::EngineStructure(__self_0) =>
                NdbType::EngineStructure(::core::clone::Clone::clone(__self_0)),
            NdbType::Struct(__self_0) =>
                NdbType::Struct(::core::clone::Clone::clone(__self_0)),
            NdbType::Unknown => NdbType::Unknown,
            NdbType::Raw(__self_0) =>
                NdbType::Raw(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NdbType {
    #[inline]
    fn eq(&self, other: &NdbType) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (NdbType::EngineStructure(__self_0),
                    NdbType::EngineStructure(__arg1_0)) => __self_0 == __arg1_0,
                (NdbType::Struct(__self_0), NdbType::Struct(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (NdbType::Raw(__self_0), NdbType::Raw(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NdbType {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u8>;
        let _: ::core::cmp::AssertParamIsEq<usize>;
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for NdbType {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            NdbType::EngineStructure(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            NdbType::Struct(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            NdbType::Raw(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NdbType {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    NdbType::Float =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "NdbType", 0u32, "Float"),
                    NdbType::Int =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "NdbType", 1u32, "Int"),
                    NdbType::Void =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "NdbType", 2u32, "Void"),
                    NdbType::Object =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "NdbType", 3u32, "Object"),
                    NdbType::String =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "NdbType", 4u32, "String"),
                    NdbType::EngineStructure(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "NdbType", 5u32, "EngineStructure", __field0),
                    NdbType::Struct(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "NdbType", 6u32, "Struct", __field0),
                    NdbType::Unknown =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "NdbType", 7u32, "Unknown"),
                    NdbType::Raw(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "NdbType", 8u32, "Raw", __field0),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for NdbType {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __field5,
                    __field6,
                    __field7,
                    __field8,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            5u64 => _serde::__private228::Ok(__Field::__field5),
                            6u64 => _serde::__private228::Ok(__Field::__field6),
                            7u64 => _serde::__private228::Ok(__Field::__field7),
                            8u64 => _serde::__private228::Ok(__Field::__field8),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 9")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "Float" => _serde::__private228::Ok(__Field::__field0),
                            "Int" => _serde::__private228::Ok(__Field::__field1),
                            "Void" => _serde::__private228::Ok(__Field::__field2),
                            "Object" => _serde::__private228::Ok(__Field::__field3),
                            "String" => _serde::__private228::Ok(__Field::__field4),
                            "EngineStructure" =>
                                _serde::__private228::Ok(__Field::__field5),
                            "Struct" => _serde::__private228::Ok(__Field::__field6),
                            "Unknown" => _serde::__private228::Ok(__Field::__field7),
                            "Raw" => _serde::__private228::Ok(__Field::__field8),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"Float" => _serde::__private228::Ok(__Field::__field0),
                            b"Int" => _serde::__private228::Ok(__Field::__field1),
                            b"Void" => _serde::__private228::Ok(__Field::__field2),
                            b"Object" => _serde::__private228::Ok(__Field::__field3),
                            b"String" => _serde::__private228::Ok(__Field::__field4),
                            b"EngineStructure" =>
                                _serde::__private228::Ok(__Field::__field5),
                            b"Struct" => _serde::__private228::Ok(__Field::__field6),
                            b"Unknown" => _serde::__private228::Ok(__Field::__field7),
                            b"Raw" => _serde::__private228::Ok(__Field::__field8),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<NdbType>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = NdbType;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum NdbType")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(NdbType::Float)
                            }
                            (__Field::__field1, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(NdbType::Int)
                            }
                            (__Field::__field2, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(NdbType::Void)
                            }
                            (__Field::__field3, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(NdbType::Object)
                            }
                            (__Field::__field4, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(NdbType::String)
                            }
                            (__Field::__field5, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<u8>(__variant),
                                    NdbType::EngineStructure),
                            (__Field::__field6, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<usize>(__variant),
                                    NdbType::Struct),
                            (__Field::__field7, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(NdbType::Unknown)
                            }
                            (__Field::__field8, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<String>(__variant),
                                    NdbType::Raw),
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["Float", "Int", "Void", "Object", "String",
                                "EngineStructure", "Struct", "Unknown", "Raw"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "NdbType", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<NdbType>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
12pub enum NdbType {
13    /// `f`
14    Float,
15    /// `i`
16    Int,
17    /// `v`
18    Void,
19    /// `o`
20    Object,
21    /// `s`
22    String,
23    /// `e0`..`e9`
24    EngineStructure(u8),
25    /// `t0000`-style user-structure indices.
26    Struct(usize),
27    /// `?`
28    Unknown,
29    /// Any unrecognized type tag preserved verbatim.
30    Raw(String),
31}
32
33impl NdbType {
34    fn parse(input: &str) -> Self {
35        match input {
36            "f" => Self::Float,
37            "i" => Self::Int,
38            "v" => Self::Void,
39            "o" => Self::Object,
40            "s" => Self::String,
41            "?" => Self::Unknown,
42            _ if input.len() == 2 && input.starts_with('e') => input[1..]
43                .parse::<u8>()
44                .map_or_else(|_| Self::Raw(input.to_string()), Self::EngineStructure),
45            _ if input.len() == 5 && input.starts_with('t') => input[1..]
46                .parse::<usize>()
47                .map_or_else(|_| Self::Raw(input.to_string()), Self::Struct),
48            _ => Self::Raw(input.to_string()),
49        }
50    }
51}
52
53impl fmt::Display for NdbType {
54    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55        match self {
56            Self::Float => f.write_str("f"),
57            Self::Int => f.write_str("i"),
58            Self::Void => f.write_str("v"),
59            Self::Object => f.write_str("o"),
60            Self::String => f.write_str("s"),
61            Self::EngineStructure(index) => f.write_fmt(format_args!("e{0}", index))write!(f, "e{index}"),
62            Self::Struct(index) => f.write_fmt(format_args!("t{0:04}", index))write!(f, "t{index:04}"),
63            Self::Unknown => f.write_str("?"),
64            Self::Raw(raw) => f.write_str(raw),
65        }
66    }
67}
68
69/// One file entry in an `NDB` file table.
70#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbFile {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "NdbFile",
            "name", &self.name, "is_root", &&self.is_root)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NdbFile {
    #[inline]
    fn clone(&self) -> NdbFile {
        NdbFile {
            name: ::core::clone::Clone::clone(&self.name),
            is_root: ::core::clone::Clone::clone(&self.is_root),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NdbFile {
    #[inline]
    fn eq(&self, other: &NdbFile) -> bool {
        self.is_root == other.is_root && self.name == other.name
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NdbFile {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NdbFile {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "NdbFile", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_root", &self.is_root)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for NdbFile {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "name" => _serde::__private228::Ok(__Field::__field0),
                            "is_root" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"name" => _serde::__private228::Ok(__Field::__field0),
                            b"is_root" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<NdbFile>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = NdbFile;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct NdbFile")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct NdbFile with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<bool>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct NdbFile with 2 elements")),
                            };
                        _serde::__private228::Ok(NdbFile {
                                name: __field0,
                                is_root: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<bool> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("is_root"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<bool>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("is_root")?,
                            };
                        _serde::__private228::Ok(NdbFile {
                                name: __field0,
                                is_root: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["name", "is_root"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "NdbFile", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<NdbFile>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
71pub struct NdbFile {
72    /// File name as written in the debug table.
73    pub name:    String,
74    /// Whether this file is the root script file (`N`) rather than an include
75    /// (`n`).
76    pub is_root: bool,
77}
78
79/// One struct field entry in an `NDB` file.
80#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbStructField {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "NdbStructField", "label", &self.label, "ty", &&self.ty)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NdbStructField {
    #[inline]
    fn clone(&self) -> NdbStructField {
        NdbStructField {
            label: ::core::clone::Clone::clone(&self.label),
            ty: ::core::clone::Clone::clone(&self.ty),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NdbStructField {
    #[inline]
    fn eq(&self, other: &NdbStructField) -> bool {
        self.label == other.label && self.ty == other.ty
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NdbStructField {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<NdbType>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NdbStructField {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "NdbStructField", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "label", &self.label)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for NdbStructField {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "label" => _serde::__private228::Ok(__Field::__field0),
                            "ty" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"label" => _serde::__private228::Ok(__Field::__field0),
                            b"ty" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<NdbStructField>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = NdbStructField;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct NdbStructField")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct NdbStructField with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<NdbType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct NdbStructField with 2 elements")),
                            };
                        _serde::__private228::Ok(NdbStructField {
                                label: __field0,
                                ty: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<NdbType> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("label"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<NdbType>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("label")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        _serde::__private228::Ok(NdbStructField {
                                label: __field0,
                                ty: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["label", "ty"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "NdbStructField", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<NdbStructField>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
81pub struct NdbStructField {
82    /// Field name.
83    pub label: String,
84    /// Field type.
85    pub ty:    NdbType,
86}
87
88/// One struct entry in an `NDB` file.
89#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbStruct {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "NdbStruct",
            "label", &self.label, "fields", &&self.fields)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NdbStruct {
    #[inline]
    fn clone(&self) -> NdbStruct {
        NdbStruct {
            label: ::core::clone::Clone::clone(&self.label),
            fields: ::core::clone::Clone::clone(&self.fields),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NdbStruct {
    #[inline]
    fn eq(&self, other: &NdbStruct) -> bool {
        self.label == other.label && self.fields == other.fields
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NdbStruct {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<Vec<NdbStructField>>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NdbStruct {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "NdbStruct", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "label", &self.label)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "fields", &self.fields)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for NdbStruct {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "label" => _serde::__private228::Ok(__Field::__field0),
                            "fields" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"label" => _serde::__private228::Ok(__Field::__field0),
                            b"fields" => _serde::__private228::Ok(__Field::__field1),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<NdbStruct>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = NdbStruct;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct NdbStruct")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct NdbStruct with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Vec<NdbStructField>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct NdbStruct with 2 elements")),
                            };
                        _serde::__private228::Ok(NdbStruct {
                                label: __field0,
                                fields: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Vec<NdbStructField>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("label"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("fields"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<NdbStructField>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("label")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("fields")?,
                            };
                        _serde::__private228::Ok(NdbStruct {
                                label: __field0,
                                fields: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["label", "fields"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "NdbStruct", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<NdbStruct>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
90pub struct NdbStruct {
91    /// Struct name.
92    pub label:  String,
93    /// Declared fields in write order.
94    pub fields: Vec<NdbStructField>,
95}
96
97/// One function entry in an `NDB` file.
98#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbFunction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "NdbFunction",
            "label", &self.label, "binary_start", &self.binary_start,
            "binary_end", &self.binary_end, "return_type", &self.return_type,
            "args", &&self.args)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NdbFunction {
    #[inline]
    fn clone(&self) -> NdbFunction {
        NdbFunction {
            label: ::core::clone::Clone::clone(&self.label),
            binary_start: ::core::clone::Clone::clone(&self.binary_start),
            binary_end: ::core::clone::Clone::clone(&self.binary_end),
            return_type: ::core::clone::Clone::clone(&self.return_type),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NdbFunction {
    #[inline]
    fn eq(&self, other: &NdbFunction) -> bool {
        self.binary_start == other.binary_start &&
                        self.binary_end == other.binary_end &&
                    self.label == other.label &&
                self.return_type == other.return_type &&
            self.args == other.args
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NdbFunction {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<u32>;
        let _: ::core::cmp::AssertParamIsEq<NdbType>;
        let _: ::core::cmp::AssertParamIsEq<Vec<NdbType>>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NdbFunction {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "NdbFunction", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "label", &self.label)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "binary_start", &self.binary_start)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "binary_end", &self.binary_end)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "return_type", &self.return_type)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "args", &self.args)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for NdbFunction {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "label" => _serde::__private228::Ok(__Field::__field0),
                            "binary_start" =>
                                _serde::__private228::Ok(__Field::__field1),
                            "binary_end" => _serde::__private228::Ok(__Field::__field2),
                            "return_type" =>
                                _serde::__private228::Ok(__Field::__field3),
                            "args" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"label" => _serde::__private228::Ok(__Field::__field0),
                            b"binary_start" =>
                                _serde::__private228::Ok(__Field::__field1),
                            b"binary_end" =>
                                _serde::__private228::Ok(__Field::__field2),
                            b"return_type" =>
                                _serde::__private228::Ok(__Field::__field3),
                            b"args" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<NdbFunction>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = NdbFunction;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct NdbFunction")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct NdbFunction with 5 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct NdbFunction with 5 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct NdbFunction with 5 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<NdbType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct NdbFunction with 5 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<Vec<NdbType>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct NdbFunction with 5 elements")),
                            };
                        _serde::__private228::Ok(NdbFunction {
                                label: __field0,
                                binary_start: __field1,
                                binary_end: __field2,
                                return_type: __field3,
                                args: __field4,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<u32> =
                            _serde::__private228::None;
                        let mut __field2: _serde::__private228::Option<u32> =
                            _serde::__private228::None;
                        let mut __field3: _serde::__private228::Option<NdbType> =
                            _serde::__private228::None;
                        let mut __field4:
                                _serde::__private228::Option<Vec<NdbType>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("label"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("binary_start"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("binary_end"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("return_type"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<NdbType>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("args"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<NdbType>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("label")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("binary_start")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("binary_end")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("return_type")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("args")?,
                            };
                        _serde::__private228::Ok(NdbFunction {
                                label: __field0,
                                binary_start: __field1,
                                binary_end: __field2,
                                return_type: __field3,
                                args: __field4,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["label", "binary_start", "binary_end", "return_type",
                                "args"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "NdbFunction", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<NdbFunction>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
99pub struct NdbFunction {
100    /// Function name.
101    pub label:        String,
102    /// Start byte offset in the emitted `NCS`.
103    pub binary_start: u32,
104    /// End byte offset in the emitted `NCS`.
105    pub binary_end:   u32,
106    /// Return type abbreviation.
107    pub return_type:  NdbType,
108    /// Parameter types in declaration order.
109    pub args:         Vec<NdbType>,
110}
111
112/// One variable entry in an `NDB` file.
113#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbVariable {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "NdbVariable",
            "label", &self.label, "ty", &self.ty, "binary_start",
            &self.binary_start, "binary_end", &self.binary_end, "stack_loc",
            &&self.stack_loc)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NdbVariable {
    #[inline]
    fn clone(&self) -> NdbVariable {
        NdbVariable {
            label: ::core::clone::Clone::clone(&self.label),
            ty: ::core::clone::Clone::clone(&self.ty),
            binary_start: ::core::clone::Clone::clone(&self.binary_start),
            binary_end: ::core::clone::Clone::clone(&self.binary_end),
            stack_loc: ::core::clone::Clone::clone(&self.stack_loc),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NdbVariable {
    #[inline]
    fn eq(&self, other: &NdbVariable) -> bool {
        self.binary_start == other.binary_start &&
                        self.binary_end == other.binary_end &&
                    self.stack_loc == other.stack_loc &&
                self.label == other.label && self.ty == other.ty
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NdbVariable {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<String>;
        let _: ::core::cmp::AssertParamIsEq<NdbType>;
        let _: ::core::cmp::AssertParamIsEq<u32>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NdbVariable {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "NdbVariable", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "label", &self.label)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "binary_start", &self.binary_start)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "binary_end", &self.binary_end)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "stack_loc", &self.stack_loc)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for NdbVariable {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "label" => _serde::__private228::Ok(__Field::__field0),
                            "ty" => _serde::__private228::Ok(__Field::__field1),
                            "binary_start" =>
                                _serde::__private228::Ok(__Field::__field2),
                            "binary_end" => _serde::__private228::Ok(__Field::__field3),
                            "stack_loc" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"label" => _serde::__private228::Ok(__Field::__field0),
                            b"ty" => _serde::__private228::Ok(__Field::__field1),
                            b"binary_start" =>
                                _serde::__private228::Ok(__Field::__field2),
                            b"binary_end" =>
                                _serde::__private228::Ok(__Field::__field3),
                            b"stack_loc" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<NdbVariable>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = NdbVariable;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct NdbVariable")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct NdbVariable with 5 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<NdbType>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct NdbVariable with 5 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct NdbVariable with 5 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct NdbVariable with 5 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct NdbVariable with 5 elements")),
                            };
                        _serde::__private228::Ok(NdbVariable {
                                label: __field0,
                                ty: __field1,
                                binary_start: __field2,
                                binary_end: __field3,
                                stack_loc: __field4,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<NdbType> =
                            _serde::__private228::None;
                        let mut __field2: _serde::__private228::Option<u32> =
                            _serde::__private228::None;
                        let mut __field3: _serde::__private228::Option<u32> =
                            _serde::__private228::None;
                        let mut __field4: _serde::__private228::Option<u32> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("label"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("ty"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<NdbType>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("binary_start"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("binary_end"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("stack_loc"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("label")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("ty")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("binary_start")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("binary_end")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("stack_loc")?,
                            };
                        _serde::__private228::Ok(NdbVariable {
                                label: __field0,
                                ty: __field1,
                                binary_start: __field2,
                                binary_end: __field3,
                                stack_loc: __field4,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["label", "ty", "binary_start", "binary_end", "stack_loc"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "NdbVariable", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<NdbVariable>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
114pub struct NdbVariable {
115    /// Variable name.
116    pub label:        String,
117    /// Variable type abbreviation.
118    pub ty:           NdbType,
119    /// Start byte offset in the emitted `NCS`.
120    pub binary_start: u32,
121    /// End byte offset in the emitted `NCS`.
122    pub binary_end:   u32,
123    /// Stack location as recorded by the compiler.
124    pub stack_loc:    u32,
125}
126
127/// One line mapping entry in an `NDB` file.
128#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbLine {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "NdbLine",
            "file_num", &self.file_num, "line_num", &self.line_num,
            "binary_start", &self.binary_start, "binary_end",
            &&self.binary_end)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for NdbLine {
    #[inline]
    fn clone(&self) -> NdbLine {
        NdbLine {
            file_num: ::core::clone::Clone::clone(&self.file_num),
            line_num: ::core::clone::Clone::clone(&self.line_num),
            binary_start: ::core::clone::Clone::clone(&self.binary_start),
            binary_end: ::core::clone::Clone::clone(&self.binary_end),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NdbLine {
    #[inline]
    fn eq(&self, other: &NdbLine) -> bool {
        self.binary_start == other.binary_start &&
                    self.binary_end == other.binary_end &&
                self.file_num == other.file_num &&
            self.line_num == other.line_num
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NdbLine {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<usize>;
        let _: ::core::cmp::AssertParamIsEq<u32>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NdbLine {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "NdbLine", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "file_num", &self.file_num)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "line_num", &self.line_num)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "binary_start", &self.binary_start)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "binary_end", &self.binary_end)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for NdbLine {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "file_num" => _serde::__private228::Ok(__Field::__field0),
                            "line_num" => _serde::__private228::Ok(__Field::__field1),
                            "binary_start" =>
                                _serde::__private228::Ok(__Field::__field2),
                            "binary_end" => _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"file_num" => _serde::__private228::Ok(__Field::__field0),
                            b"line_num" => _serde::__private228::Ok(__Field::__field1),
                            b"binary_start" =>
                                _serde::__private228::Ok(__Field::__field2),
                            b"binary_end" =>
                                _serde::__private228::Ok(__Field::__field3),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<NdbLine>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = NdbLine;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct NdbLine")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<usize>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct NdbLine with 4 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<usize>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct NdbLine with 4 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct NdbLine with 4 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct NdbLine with 4 elements")),
                            };
                        _serde::__private228::Ok(NdbLine {
                                file_num: __field0,
                                line_num: __field1,
                                binary_start: __field2,
                                binary_end: __field3,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<usize> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<usize> =
                            _serde::__private228::None;
                        let mut __field2: _serde::__private228::Option<u32> =
                            _serde::__private228::None;
                        let mut __field3: _serde::__private228::Option<u32> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("file_num"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<usize>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("line_num"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<usize>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("binary_start"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("binary_end"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("file_num")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("line_num")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("binary_start")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("binary_end")?,
                            };
                        _serde::__private228::Ok(NdbLine {
                                file_num: __field0,
                                line_num: __field1,
                                binary_start: __field2,
                                binary_end: __field3,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["file_num", "line_num", "binary_start", "binary_end"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "NdbLine", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<NdbLine>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
129pub struct NdbLine {
130    /// File-table index.
131    pub file_num:     usize,
132    /// One-based source line number.
133    pub line_num:     usize,
134    /// Start byte offset in the emitted `NCS`.
135    pub binary_start: u32,
136    /// End byte offset in the emitted `NCS`.
137    pub binary_end:   u32,
138}
139
140/// Parsed contents of an `NDB V1.0` file.
141#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Ndb {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "Ndb", "files",
            &self.files, "structs", &self.structs, "functions",
            &self.functions, "variables", &self.variables, "lines",
            &&self.lines)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for Ndb {
    #[inline]
    fn clone(&self) -> Ndb {
        Ndb {
            files: ::core::clone::Clone::clone(&self.files),
            structs: ::core::clone::Clone::clone(&self.structs),
            functions: ::core::clone::Clone::clone(&self.functions),
            variables: ::core::clone::Clone::clone(&self.variables),
            lines: ::core::clone::Clone::clone(&self.lines),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Ndb {
    #[inline]
    fn eq(&self, other: &Ndb) -> bool {
        self.files == other.files && self.structs == other.structs &&
                    self.functions == other.functions &&
                self.variables == other.variables && self.lines == other.lines
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Ndb {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Vec<NdbFile>>;
        let _: ::core::cmp::AssertParamIsEq<Vec<NdbStruct>>;
        let _: ::core::cmp::AssertParamIsEq<Vec<NdbFunction>>;
        let _: ::core::cmp::AssertParamIsEq<Vec<NdbVariable>>;
        let _: ::core::cmp::AssertParamIsEq<Vec<NdbLine>>;
    }
}Eq, #[automatically_derived]
impl ::core::default::Default for Ndb {
    #[inline]
    fn default() -> Ndb {
        Ndb {
            files: ::core::default::Default::default(),
            structs: ::core::default::Default::default(),
            functions: ::core::default::Default::default(),
            variables: ::core::default::Default::default(),
            lines: ::core::default::Default::default(),
        }
    }
}Default, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for Ndb {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer, "Ndb",
                            false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "files", &self.files)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "structs", &self.structs)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "functions", &self.functions)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "variables", &self.variables)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "lines", &self.lines)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for Ndb {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "files" => _serde::__private228::Ok(__Field::__field0),
                            "structs" => _serde::__private228::Ok(__Field::__field1),
                            "functions" => _serde::__private228::Ok(__Field::__field2),
                            "variables" => _serde::__private228::Ok(__Field::__field3),
                            "lines" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"files" => _serde::__private228::Ok(__Field::__field0),
                            b"structs" => _serde::__private228::Ok(__Field::__field1),
                            b"functions" => _serde::__private228::Ok(__Field::__field2),
                            b"variables" => _serde::__private228::Ok(__Field::__field3),
                            b"lines" => _serde::__private228::Ok(__Field::__field4),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<Ndb>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = Ndb;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct Ndb")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<Vec<NdbFile>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct Ndb with 5 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Vec<NdbStruct>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct Ndb with 5 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Vec<NdbFunction>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct Ndb with 5 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<Vec<NdbVariable>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct Ndb with 5 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<Vec<NdbLine>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct Ndb with 5 elements")),
                            };
                        _serde::__private228::Ok(Ndb {
                                files: __field0,
                                structs: __field1,
                                functions: __field2,
                                variables: __field3,
                                lines: __field4,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<Vec<NdbFile>> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Vec<NdbStruct>> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Vec<NdbFunction>> =
                            _serde::__private228::None;
                        let mut __field3:
                                _serde::__private228::Option<Vec<NdbVariable>> =
                            _serde::__private228::None;
                        let mut __field4:
                                _serde::__private228::Option<Vec<NdbLine>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("files"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<NdbFile>>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("structs"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<NdbStruct>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("functions"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<NdbFunction>>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("variables"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<NdbVariable>>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("lines"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<NdbLine>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("files")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("structs")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("functions")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("variables")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("lines")?,
                            };
                        _serde::__private228::Ok(Ndb {
                                files: __field0,
                                structs: __field1,
                                functions: __field2,
                                variables: __field3,
                                lines: __field4,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["files", "structs", "functions", "variables", "lines"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "Ndb", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<Ndb>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
142pub struct Ndb {
143    /// File table entries.
144    pub files:     Vec<NdbFile>,
145    /// Declared structs.
146    pub structs:   Vec<NdbStruct>,
147    /// Function debug entries.
148    pub functions: Vec<NdbFunction>,
149    /// Variable debug entries.
150    pub variables: Vec<NdbVariable>,
151    /// Source line mappings.
152    pub lines:     Vec<NdbLine>,
153}
154
155/// Errors returned while parsing or writing `NDB V1.0`.
156#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NdbError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            NdbError::Io(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Io",
                    &__self_0),
            NdbError::Expectation(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Expectation", &__self_0),
            NdbError::Parse(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Parse",
                    &__self_0),
        }
    }
}Debug)]
157pub enum NdbError {
158    /// An underlying I/O operation failed.
159    Io(io::Error),
160    /// The file violated a structural expectation.
161    Expectation(ExpectationError),
162    /// A line could not be parsed.
163    Parse(String),
164}
165
166impl NdbError {
167    fn parse(message: impl Into<String>) -> Self {
168        Self::Parse(message.into())
169    }
170}
171
172impl fmt::Display for NdbError {
173    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
174        match self {
175            Self::Io(error) => error.fmt(f),
176            Self::Expectation(error) => error.fmt(f),
177            Self::Parse(message) => f.write_str(message),
178        }
179    }
180}
181
182impl Error for NdbError {}
183
184impl From<io::Error> for NdbError {
185    fn from(value: io::Error) -> Self {
186        Self::Io(value)
187    }
188}
189
190impl From<ExpectationError> for NdbError {
191    fn from(value: ExpectationError) -> Self {
192        Self::Expectation(value)
193    }
194}
195
196/// Parses `NDB V1.0` from a buffered reader.
197///
198/// # Errors
199///
200/// Returns [`NdbError`] if the header is invalid or a record is malformed.
201pub fn read_ndb<R: BufRead>(reader: &mut R) -> Result<Ndb, NdbError> {
202    let mut header = String::new();
203    reader.read_line(&mut header)?;
204    expect(
205        header.trim_end_matches(['\r', '\n']) == "NDB V1.0",
206        "invalid NDB header",
207    )?;
208
209    let mut counts_line = String::new();
210    reader.read_line(&mut counts_line)?;
211    let counts = counts_line
212        .split_whitespace()
213        .map(|part| {
214            part.parse::<usize>().map_err(|error| {
215                NdbError::parse(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB section count {0:?}: {1}",
                part, error))
    })format!("invalid NDB section count {part:?}: {error}"))
216            })
217        })
218        .collect::<Result<Vec<_>, _>>()?;
219    expect(
220        counts.len() == 5,
221        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("expected 5 NDB section counts, found {0}",
                counts.len()))
    })format!("expected 5 NDB section counts, found {}", counts.len()),
222    )?;
223    let expected_files = counts.first().copied().unwrap_or(0);
224    let expected_structs = counts.get(1).copied().unwrap_or(0);
225    let expected_functions = counts.get(2).copied().unwrap_or(0);
226    let expected_variables = counts.get(3).copied().unwrap_or(0);
227    let expected_lines = counts.get(4).copied().unwrap_or(0);
228
229    let mut result = Ndb::default();
230    let mut line = String::new();
231    while reader.read_line(&mut line)? != 0 {
232        let trimmed = line.trim();
233        if trimmed.is_empty() || trimmed.starts_with('#') {
234            line.clear();
235            continue;
236        }
237
238        let parts = trimmed.split_whitespace().collect::<Vec<_>>();
239        expect(!parts.is_empty(), "encountered empty NDB record")?;
240        let part = |index| {
241            parts.get(index).copied().ok_or_else(|| {
242                NdbError::parse(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("missing field {0} in NDB record: {1}",
                index, trimmed))
    })format!("missing field {index} in NDB record: {trimmed}"))
243            })
244        };
245        match part(0)? {
246            tag if tag.starts_with('N') || tag.starts_with('n') => {
247                expect(
248                    parts.len() == 2,
249                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB file record: {0}",
                trimmed))
    })format!("invalid NDB file record: {trimmed}"),
250                )?;
251                let index = parse_usize(&tag[1..], trimmed)?;
252                expect(
253                    index == result.files.len(),
254                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("out-of-order NDB file record index {0} in {1}",
                index, trimmed))
    })format!("out-of-order NDB file record index {index} in {trimmed}"),
255                )?;
256                result.files.push(NdbFile {
257                    name:    part(1)?.to_string(),
258                    is_root: tag.starts_with('N'),
259                });
260            }
261            "s" => {
262                expect(
263                    parts.len() == 3,
264                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB struct record: {0}",
                trimmed))
    })format!("invalid NDB struct record: {trimmed}"),
265                )?;
266                result.structs.push(NdbStruct {
267                    label:  part(2)?.to_string(),
268                    fields: Vec::with_capacity(parse_usize(part(1)?, trimmed)?),
269                });
270            }
271            "sf" => {
272                expect(
273                    parts.len() == 3,
274                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB struct field record: {0}",
                trimmed))
    })format!("invalid NDB struct field record: {trimmed}"),
275                )?;
276                let structure = result.structs.last_mut().ok_or_else(|| {
277                    NdbError::parse(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("struct field without struct header: {0}",
                trimmed))
    })format!("struct field without struct header: {trimmed}"))
278                })?;
279                structure.fields.push(NdbStructField {
280                    label: part(2)?.to_string(),
281                    ty:    NdbType::parse(part(1)?),
282                });
283            }
284            "f" => {
285                expect(
286                    parts.len() == 6,
287                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB function record: {0}",
                trimmed))
    })format!("invalid NDB function record: {trimmed}"),
288                )?;
289                result.functions.push(NdbFunction {
290                    label:        part(5)?.to_string(),
291                    binary_start: parse_hex_u32(part(1)?, trimmed)?,
292                    binary_end:   parse_hex_u32(part(2)?, trimmed)?,
293                    return_type:  NdbType::parse(part(4)?),
294                    args:         Vec::with_capacity(parse_usize(part(3)?, trimmed)?),
295                });
296            }
297            "fp" => {
298                expect(
299                    parts.len() == 2,
300                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB function parameter record: {0}",
                trimmed))
    })format!("invalid NDB function parameter record: {trimmed}"),
301                )?;
302                let function = result.functions.last_mut().ok_or_else(|| {
303                    NdbError::parse(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("function parameter without function header: {0}",
                trimmed))
    })format!(
304                        "function parameter without function header: {trimmed}"
305                    ))
306                })?;
307                function.args.push(NdbType::parse(part(1)?));
308            }
309            "v" => {
310                expect(
311                    parts.len() == 6,
312                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB variable record: {0}",
                trimmed))
    })format!("invalid NDB variable record: {trimmed}"),
313                )?;
314                result.variables.push(NdbVariable {
315                    label:        part(5)?.to_string(),
316                    ty:           NdbType::parse(part(4)?),
317                    binary_start: parse_hex_u32(part(1)?, trimmed)?,
318                    binary_end:   parse_hex_u32(part(2)?, trimmed)?,
319                    stack_loc:    parse_hex_u32(part(3)?, trimmed)?,
320                });
321            }
322            tag if tag.starts_with('l') => {
323                expect(
324                    parts.len() == 4,
325                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid NDB line record: {0}",
                trimmed))
    })format!("invalid NDB line record: {trimmed}"),
326                )?;
327                result.lines.push(NdbLine {
328                    file_num:     parse_usize(&tag[1..], trimmed)?,
329                    line_num:     parse_usize(part(1)?, trimmed)?,
330                    binary_start: parse_hex_u32(part(2)?, trimmed)?,
331                    binary_end:   parse_hex_u32(part(3)?, trimmed)?,
332                });
333            }
334            _ => {
335                return Err(NdbError::parse(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("unrecognized NDB record: {0}",
                trimmed))
    })format!(
336                    "unrecognized NDB record: {trimmed}"
337                )));
338            }
339        }
340
341        line.clear();
342    }
343
344    expect(
345        result.files.len() == expected_files,
346        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("expected {0} file entries, found {1}",
                expected_files, result.files.len()))
    })format!(
347            "expected {} file entries, found {}",
348            expected_files,
349            result.files.len()
350        ),
351    )?;
352    expect(
353        result.structs.len() == expected_structs,
354        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("expected {0} struct entries, found {1}",
                expected_structs, result.structs.len()))
    })format!(
355            "expected {} struct entries, found {}",
356            expected_structs,
357            result.structs.len()
358        ),
359    )?;
360    expect(
361        result.functions.len() == expected_functions,
362        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("expected {0} function entries, found {1}",
                expected_functions, result.functions.len()))
    })format!(
363            "expected {} function entries, found {}",
364            expected_functions,
365            result.functions.len()
366        ),
367    )?;
368    expect(
369        result.variables.len() == expected_variables,
370        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("expected {0} variable entries, found {1}",
                expected_variables, result.variables.len()))
    })format!(
371            "expected {} variable entries, found {}",
372            expected_variables,
373            result.variables.len()
374        ),
375    )?;
376    expect(
377        result.lines.len() == expected_lines,
378        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("expected {0} line entries, found {1}",
                expected_lines, result.lines.len()))
    })format!(
379            "expected {} line entries, found {}",
380            expected_lines,
381            result.lines.len()
382        ),
383    )?;
384
385    Ok(result)
386}
387
388/// Parses `NDB V1.0` from a string slice.
389///
390/// # Errors
391///
392/// Returns [`NdbError`] if the header is invalid or a record is malformed.
393pub fn parse_ndb_str(input: &str) -> Result<Ndb, NdbError> {
394    let mut reader = io::Cursor::new(input.as_bytes());
395    read_ndb(&mut reader)
396}
397
398/// Writes an `NDB V1.0` file in upstream-compatible textual form.
399///
400/// # Errors
401///
402/// Returns [`NdbError`] if the write fails.
403pub fn write_ndb<W: Write>(writer: &mut W, ndb: &Ndb) -> Result<(), NdbError> {
404    writer.write_fmt(format_args!("NDB V1.0\n"))writeln!(writer, "NDB V1.0")?;
405    writer.write_fmt(format_args!("{0:07} {1:07} {2:07} {3:07} {4:07}\n",
        ndb.files.len(), ndb.structs.len(), ndb.functions.len(),
        ndb.variables.len(), ndb.lines.len()))writeln!(
406        writer,
407        "{:07} {:07} {:07} {:07} {:07}",
408        ndb.files.len(),
409        ndb.structs.len(),
410        ndb.functions.len(),
411        ndb.variables.len(),
412        ndb.lines.len()
413    )?;
414
415    for (index, file) in ndb.files.iter().enumerate() {
416        let prefix = if file.is_root { 'N' } else { 'n' };
417        writer.write_fmt(format_args!("{1}{2:02} {0}\n", file.name, prefix, index))writeln!(writer, "{prefix}{index:02} {}", file.name)?;
418    }
419
420    for structure in &ndb.structs {
421        writer.write_fmt(format_args!("s {0:02} {1}\n", structure.fields.len(),
        structure.label))writeln!(
422            writer,
423            "s {:02} {}",
424            structure.fields.len(),
425            structure.label
426        )?;
427        for field in &structure.fields {
428            writer.write_fmt(format_args!("sf {0} {1}\n", field.ty, field.label))writeln!(writer, "sf {} {}", field.ty, field.label)?;
429        }
430    }
431
432    for function in &ndb.functions {
433        writer.write_fmt(format_args!("f {0:08x} {1:08x} {2:03} {3} {4}\n",
        function.binary_start, function.binary_end, function.args.len(),
        function.return_type, function.label))writeln!(
434            writer,
435            "f {:08x} {:08x} {:03} {} {}",
436            function.binary_start,
437            function.binary_end,
438            function.args.len(),
439            function.return_type,
440            function.label
441        )?;
442        for arg in &function.args {
443            writer.write_fmt(format_args!("fp {0}\n", arg))writeln!(writer, "fp {arg}")?;
444        }
445    }
446
447    for variable in &ndb.variables {
448        writer.write_fmt(format_args!("v {0:08x} {1:08x} {2:08x} {3} {4}\n",
        variable.binary_start, variable.binary_end, variable.stack_loc,
        variable.ty, variable.label))writeln!(
449            writer,
450            "v {:08x} {:08x} {:08x} {} {}",
451            variable.binary_start,
452            variable.binary_end,
453            variable.stack_loc,
454            variable.ty,
455            variable.label
456        )?;
457    }
458
459    for line in &ndb.lines {
460        writer.write_fmt(format_args!("l{0:02} {1:07} {2:08x} {3:08x}\n",
        line.file_num, line.line_num, line.binary_start, line.binary_end))writeln!(
461            writer,
462            "l{:02} {:07} {:08x} {:08x}",
463            line.file_num, line.line_num, line.binary_start, line.binary_end
464        )?;
465    }
466
467    Ok(())
468}
469
470fn parse_usize(input: &str, line: &str) -> Result<usize, NdbError> {
471    input
472        .parse::<usize>()
473        .map_err(|error| NdbError::parse(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid integer {0:?} in {1:?}: {2}",
                input, line, error))
    })format!("invalid integer {input:?} in {line:?}: {error}")))
474}
475
476fn parse_hex_u32(input: &str, line: &str) -> Result<u32, NdbError> {
477    u32::from_str_radix(input, 16)
478        .map_err(|error| NdbError::parse(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("invalid hex {0:?} in {1:?}: {2}",
                input, line, error))
    })format!("invalid hex {input:?} in {line:?}: {error}")))
479}
480
481#[cfg(test)]
482mod tests {
483    use super::*;
484
485    #[test]
486    fn parse_and_write_roundtrip_minimal_ndb() -> Result<(), Box<dyn std::error::Error>> {
487        let source = concat!(
488            "NDB V1.0\n",
489            "0000001 0000001 0000001 0000001 0000001\n",
490            "N00 test\n",
491            "s 01 vector\n",
492            "sf f x\n",
493            "f 00000010 00000020 002 e0 main\n",
494            "fp i\n",
495            "fp t0000\n",
496            "v 00000010 00000020 00000004 e2 nValue\n",
497            "l00 0000001 00000010 00000020\n",
498        );
499
500        let parsed = parse_ndb_str(source)?;
501        assert_eq!(
502            parsed.files.first().map(|file| file.name.as_str()),
503            Some("test")
504        );
505        assert_eq!(parsed.files.first().map(|file| file.is_root), Some(true));
506        assert_eq!(
507            parsed
508                .structs
509                .first()
510                .and_then(|structure| structure.fields.first())
511                .map(|field| field.label.as_str()),
512            Some("x")
513        );
514        assert_eq!(
515            parsed
516                .functions
517                .first()
518                .map(|function| function.return_type.clone()),
519            Some(NdbType::EngineStructure(0))
520        );
521        assert_eq!(
522            parsed
523                .functions
524                .first()
525                .map(|function| function.args.clone()),
526            Some(vec![NdbType::Int, NdbType::Struct(0)])
527        );
528        assert_eq!(
529            parsed.variables.first().map(|variable| variable.ty.clone()),
530            Some(NdbType::EngineStructure(2))
531        );
532
533        let mut output = Vec::new();
534        write_ndb(&mut output, &parsed)?;
535        let written = String::from_utf8(output)?;
536        assert_eq!(written, source);
537        Ok(())
538    }
539}