#[macro_export]
macro_rules! get {
($object:expr, $field_name:literal, $as_convert:ident, $error:path) => {{
use $error;
get! {@option $object, $field_name, $as_convert, $error}
.ok_or_else(|| Error::MissingJsonField { field: $field_name })?
}};
(@option[next] $object:expr, $field_name:literal, $next:expr, $error:path) => {{
use simd_json::derived::TypedScalarValue;
if let Some(some) = $object.remove($field_name) {
if some.is_null() { None } else { $next(some)? }
} else {
None
}
}};
(@option $object:expr, $field_name:literal, $as_convert:ident, $error:path) => {{
get! {@option[next] $object, $field_name, |some: simd_json::owned::Value| {
use $error;
Ok::<_, Error>(Some(some.$as_convert().map_err(|err| Error::WrongJsonType {
err,
field: $field_name,
})?))
}, $error}
}};
(@map[preserve - order] $object:expr, $field_name:literal, $as_convert:ident, $error:path) => {{
use simd_json::derived::ValueTryIntoObject;
let base = get! {$object, $field_name, try_into_object, $error};
get! {@mk_map base, $as_convert, $error}
}};
(@mk_map $object:expr, $as_convert:ident, $error:path) => {{
use $error;
$object
.into_iter()
.map(|(key, nested_value)| {
Ok::<_, Error>((
key,
nested_value
.$as_convert()
.map_err(|err| Error::WrongJsonType {
err,
field: "metadata field",
})?,
))
})
.collect::<Result<_, _>>()?
}};
}
pub(crate) use get;
pub trait OperationData {
type DecodeError: std::fmt::Debug + std::fmt::Display + std::error::Error;
fn is_root(&self) -> bool;
fn from_value(
raw: simd_json::owned::Value,
predicted_type: u64,
) -> Result<Self, Self::DecodeError>
where
Self: Sized;
fn as_value(&self) -> simd_json::borrowed::Object<'_>;
fn to_json_type(&self) -> u64;
}