#[macro_export]
macro_rules! impl_debug_list {
($ty:ty, |$self:ident| $iter:expr $(,)?) => {
impl ::core::fmt::Debug for $ty {
fn fmt(&$self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.debug_list().entries($iter).finish()
}
}
#[cfg(feature = "defmt")]
impl ::defmt::Format for $ty {
fn format(&$self, f: ::defmt::Formatter) {
::defmt::write!(f, "[");
let mut first = true;
for v in $iter {
if first {
first = false;
} else {
::defmt::write!(f, ", ");
}
::defmt::write!(f, "{}", v);
}
::defmt::write!(f, "]");
}
}
};
}
#[macro_export]
macro_rules! bitfield_named_serde {
($bitfield:ident, $typescript_type:literal, { $( $field:ident = $setter:ident ),+ $(,)? }) => {
impl serde::Serialize for $bitfield {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> ::core::result::Result<S::Ok, S::Error> {
if serializer.is_human_readable() {
#[derive(serde::Serialize)]
struct Repr { $($field: bool,)+ }
serde::Serialize::serialize(&Repr { $($field: self.$field(),)+ }, serializer)
} else {
serializer.serialize_u8(self.into_bits())
}
}
}
impl<'de> serde::Deserialize<'de> for $bitfield {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> ::core::result::Result<Self, D::Error> {
if deserializer.is_human_readable() {
#[derive(serde::Deserialize)]
#[serde(default)]
struct Repr { $($field: bool,)+ }
impl ::core::default::Default for Repr {
fn default() -> Self { Self { $($field: false,)+ } }
}
let r = <Repr as serde::Deserialize>::deserialize(deserializer)?;
::core::result::Result::Ok(Self::new() $(.$setter(r.$field))+)
} else {
::core::result::Result::Ok(Self::from_bits(<u8 as serde::Deserialize>::deserialize(deserializer)?))
}
}
}
#[cfg(feature = "wasm")]
const _: () = {
#[::wasm_bindgen::prelude::wasm_bindgen(typescript_custom_section)]
const TS_APPEND_CONTENT: &'static str = concat!(
"export type ", stringify!($bitfield), " = {",
$( " ", stringify!($field), ": boolean;", )+
" };"
);
};
$crate::wasm_object_abi!($bitfield, $typescript_type);
};
}
#[macro_export]
macro_rules! wasm_object_abi {
($ty:ident, $typescript_type:literal) => {
#[cfg(feature = "wasm")]
const _: () = {
use ::wasm_bindgen::convert::{IntoWasmAbi, OptionIntoWasmAbi};
use ::wasm_bindgen::describe::WasmDescribe;
use ::wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(typescript_type = $typescript_type)]
type WasmObject;
}
impl From<$ty> for JsValue {
#[inline]
fn from(value: $ty) -> Self {
::serde_wasm_bindgen::to_value(&value).unwrap_throw()
}
}
impl WasmDescribe for $ty {
#[inline]
fn describe() {
WasmObject::describe();
}
}
impl IntoWasmAbi for $ty {
type Abi = <JsValue as IntoWasmAbi>::Abi;
#[inline]
fn into_abi(self) -> Self::Abi {
JsValue::from(self).into_abi()
}
}
impl OptionIntoWasmAbi for $ty {
#[inline]
fn none() -> Self::Abi {
<JsValue as OptionIntoWasmAbi>::none()
}
}
};
};
}