use serde::Serialize;
use super::WireDataTypeV1;
use crate::Value;
use crate::value::ValueRepr;
macro_rules! define_scalar_wire_ref {
(
$($arg:expr),*;
$(
(
[$($cfg:meta),*],
$variant:ident,
$type:ty,
$_data_type:expr,
$_materialization:ident,
$_json_class:ident,
$_number_projection:ident,
$_value_doc:literal,
$_multi_doc:literal,
[$($scalar_attr:meta),*],
[$($collection_attr:meta),*],
$tag:literal,
$_wire_preflight:ident
)
),+ $(,)?
) => {
#[derive(Clone, Copy, Serialize)]
pub(in crate::value_wire) enum ScalarWireRef<'a> {
#[serde(rename = "unset")]
Unset(
/// Declared data type of the unset scalar.
WireDataTypeV1,
),
$(
#[doc = concat!("Borrowed `", $tag, "` scalar payload.")]
$(#[$cfg])*
$(#[$scalar_attr])*
#[serde(rename = $tag)]
$variant(
#[doc = concat!("Stored `", $tag, "` scalar value.")]
&'a $type,
),
)+
}
impl<'a> From<&'a Value> for ScalarWireRef<'a> {
fn from(value: &'a Value) -> Self {
match &value.repr {
ValueRepr::Unset(data_type) => Self::Unset((*data_type).into()),
$(
$(#[$cfg])*
ValueRepr::$variant(value) => {
Self::$variant(value_storage_ref!($variant, value))
},
)+
}
}
}
};
}
for_each_value_type!(define_scalar_wire_ref);