@@ -183,46 +183,48 @@ pub trait Serializer: sealed::serializer::Sealed {
183183}
184184
185185impl dyn Serializer {
186- /// Convert any Serde `Serializer` to a trait object.
187- ///
188- /// ```rust
189- /// use erased_serde::{Serialize, Serializer};
190- /// use std::collections::BTreeMap as Map;
191- /// use std::io;
192- ///
193- /// fn main() {
194- /// // Construct some serializers.
195- /// let json = &mut serde_json::Serializer::new(io::stdout());
196- /// let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
197- ///
198- /// // The values in this map are boxed trait objects. Ordinarily this would not
199- /// // be possible with serde::Serializer because of object safety, but type
200- /// // erasure makes it possible with erased_serde::Serializer.
201- /// let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
202- /// formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
203- /// formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
204- ///
205- /// // These are boxed trait objects as well. Same thing here - type erasure
206- /// // makes this possible.
207- /// let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
208- /// values.insert("vec", Box::new(vec!["a", "b"]));
209- /// values.insert("int", Box::new(65536));
210- ///
211- /// // Pick a Serializer out of the formats map.
212- /// let format = formats.get_mut("json").unwrap();
213- ///
214- /// // Pick a Serialize out of the values map.
215- /// let value = values.get("vec").unwrap();
216- ///
217- /// // This line prints `["a","b"]` to stdout.
218- /// value.erased_serialize(format).unwrap();
219- /// }
220- /// ```
221- pub fn erase < S > ( serializer : S ) -> impl Serializer
222- where
223- S : serde:: Serializer ,
224- {
225- erase:: Serializer :: new ( serializer)
186+ return_impl_trait ! {
187+ /// Convert any Serde `Serializer` to a trait object.
188+ ///
189+ /// ```rust
190+ /// use erased_serde::{Serialize, Serializer};
191+ /// use std::collections::BTreeMap as Map;
192+ /// use std::io;
193+ ///
194+ /// fn main() {
195+ /// // Construct some serializers.
196+ /// let json = &mut serde_json::Serializer::new(io::stdout());
197+ /// let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));
198+ ///
199+ /// // The values in this map are boxed trait objects. Ordinarily this would not
200+ /// // be possible with serde::Serializer because of object safety, but type
201+ /// // erasure makes it possible with erased_serde::Serializer.
202+ /// let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
203+ /// formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
204+ /// formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));
205+ ///
206+ /// // These are boxed trait objects as well. Same thing here - type erasure
207+ /// // makes this possible.
208+ /// let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
209+ /// values.insert("vec", Box::new(vec!["a", "b"]));
210+ /// values.insert("int", Box::new(65536));
211+ ///
212+ /// // Pick a Serializer out of the formats map.
213+ /// let format = formats.get_mut("json").unwrap();
214+ ///
215+ /// // Pick a Serialize out of the values map.
216+ /// let value = values.get("vec").unwrap();
217+ ///
218+ /// // This line prints `["a","b"]` to stdout.
219+ /// value.erased_serialize(format).unwrap();
220+ /// }
221+ /// ```
222+ pub fn erase<S >( serializer: S ) -> impl Serializer [ erase:: Serializer <S >]
223+ where
224+ S : serde:: Serializer ,
225+ {
226+ erase:: Serializer :: new( serializer)
227+ }
226228 }
227229}
228230
@@ -1609,4 +1611,11 @@ mod tests {
16091611 assert :: < Vec < Box < dyn Serialize > > > ( ) ;
16101612 assert :: < Vec < Box < dyn Serialize + Send > > > ( ) ;
16111613 }
1614+
1615+ #[ test]
1616+ fn test_dangle ( ) {
1617+ let mut json_serializer = serde_json:: Serializer :: new ( Vec :: new ( ) ) ;
1618+ let _erased_serializer = <dyn Serializer >:: erase ( & mut json_serializer) ;
1619+ drop ( json_serializer) ;
1620+ }
16121621}
0 commit comments