Skip to content
This repository was archived by the owner on Jun 3, 2025. It is now read-only.

Commit b4d8818

Browse files
Introduce DynDeserialize
1 parent 5da4e62 commit b4d8818

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

merde_core/src/deserialize.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,32 @@ pub trait DeserializeOwned: Sized + IntoStatic {
249249
) -> impl Future<Output = Result<Self, MerdeError<'s>>>;
250250
}
251251

252+
pub trait DynDeserialize {
253+
fn dyn_deserialize<'de>(
254+
de: &'de mut dyn DynDeserializer<'de>,
255+
) -> Result<Box<Self>, MerdeError<'static>>
256+
where
257+
Self: Sized;
258+
}
259+
260+
impl dyn DynDeserialize {
261+
fn _assert_dyn_safe(_: Box<dyn DynDeserialize>) {}
262+
}
263+
264+
impl<T> DynDeserialize for T
265+
where
266+
T: DeserializeOwned,
267+
{
268+
fn dyn_deserialize<'de>(
269+
de: &'de mut dyn DynDeserializer<'de>,
270+
) -> Result<Box<Self>, MerdeError<'static>> {
271+
match T::deserialize_owned(de).run_sync_with_metastack() {
272+
Ok(value) => Ok(Box::new(value)),
273+
Err(e) => Err(e.into_static()),
274+
}
275+
}
276+
}
277+
252278
impl<T> DeserializeOwned for T
253279
where
254280
T: IntoStatic,

merde_core/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ pub use deserialize::DeserOpinions;
4848
pub use deserialize::Deserialize;
4949
pub use deserialize::DeserializeOwned;
5050
pub use deserialize::Deserializer;
51+
pub use deserialize::DynDeserialize;
5152
pub use deserialize::DynDeserializer;
5253
pub use deserialize::DynDeserializerExt;
5354
pub use deserialize::FieldSlot;

0 commit comments

Comments
 (0)