From d1b9f78ac5530530a2346d765aa0d48f1b2ff984 Mon Sep 17 00:00:00 2001 From: Nathan Lilienthal Date: Tue, 31 Mar 2026 15:59:52 -0400 Subject: [PATCH] Add support for Encode and Decode of Pin> --- src/derive/impls.rs | 17 ++++++++++++++++- src/derive/smart_ptr.rs | 10 ++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/derive/impls.rs b/src/derive/impls.rs index 61fd569..a8dd2a1 100644 --- a/src/derive/impls.rs +++ b/src/derive/impls.rs @@ -5,7 +5,7 @@ use crate::derive::empty::EmptyCoder; use crate::derive::map::{MapDecoder, MapEncoder}; use crate::derive::option::{OptionDecoder, OptionEncoder}; use crate::derive::result::{ResultDecoder, ResultEncoder}; -use crate::derive::smart_ptr::{DerefEncoder, FromDecoder}; +use crate::derive::smart_ptr::{DerefEncoder, FromDecoder, PinDecoder, PinEncoder}; use crate::derive::vec::{VecDecoder, VecEncoder}; use crate::derive::{Decode, Encode}; use crate::f32::{F32Decoder, F32Encoder}; @@ -17,6 +17,8 @@ use alloc::vec::Vec; use core::marker::PhantomData; use core::mem::MaybeUninit; use core::num::*; +use core::ops::Deref; +use core::pin::Pin; macro_rules! impl_both { ($t:ty, $encoder:ident, $decoder:ident) => { @@ -111,6 +113,19 @@ impl_smart_ptr!(::alloc::rc::Rc); #[cfg(target_has_atomic = "ptr")] impl_smart_ptr!(::alloc::sync::Arc); +impl Encode for Pin

+where + P::Target: Encode, +{ + type Encoder = PinEncoder

; +} +impl<'a, P: Decode<'a>> Decode<'a> for Pin

+where + Pin

: From

, +{ + type Decoder = PinDecoder<'a, P>; +} + impl Encode for [T; N] { type Encoder = ArrayEncoder; } diff --git a/src/derive/smart_ptr.rs b/src/derive/smart_ptr.rs index 0c547e2..85bd0ae 100644 --- a/src/derive/smart_ptr.rs +++ b/src/derive/smart_ptr.rs @@ -52,11 +52,15 @@ impl<'a, F: From, T: Decode<'a>> Decoder<'a, F> for FromDecoder<'a, T> { } } +pub type PinEncoder

= DerefEncoder<

::Target>; +pub type PinDecoder<'a, P> = FromDecoder<'a, P>; + #[cfg(test)] mod tests { use crate::{decode, encode}; use alloc::boxed::Box; use alloc::string::ToString; + use core::pin::Pin; #[test] fn box_() { @@ -75,4 +79,10 @@ mod tests { let v = "box".to_string().into_boxed_str(); assert_eq!(decode::>(&encode(&v)).unwrap(), v); } + + #[test] + fn pin_box_i32() { + let v = Box::pin(7i32); + assert_eq!(decode::>>(&encode(&v)).unwrap(), v); + } }