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#[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 Float,
15 Int,
17 Void,
19 Object,
21 String,
23 EngineStructure(u8),
25 Struct(usize),
27 Unknown,
29 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#[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 pub name: String,
74 pub is_root: bool,
77}
78
79#[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 pub label: String,
84 pub ty: NdbType,
86}
87
88#[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 pub label: String,
93 pub fields: Vec<NdbStructField>,
95}
96
97#[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 pub label: String,
102 pub binary_start: u32,
104 pub binary_end: u32,
106 pub return_type: NdbType,
108 pub args: Vec<NdbType>,
110}
111
112#[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 pub label: String,
117 pub ty: NdbType,
119 pub binary_start: u32,
121 pub binary_end: u32,
123 pub stack_loc: u32,
125}
126
127#[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 pub file_num: usize,
132 pub line_num: usize,
134 pub binary_start: u32,
136 pub binary_end: u32,
138}
139
140#[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 pub files: Vec<NdbFile>,
145 pub structs: Vec<NdbStruct>,
147 pub functions: Vec<NdbFunction>,
149 pub variables: Vec<NdbVariable>,
151 pub lines: Vec<NdbLine>,
153}
154
155#[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 Io(io::Error),
160 Expectation(ExpectationError),
162 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
196pub 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
388pub 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
398pub 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}