11use std:: fmt;
22
3- use crate :: { AnnotatedSerializer , Document , Error } ;
3+ use crate :: { AnnotatedSerializer , Deserializer , Document , Error } ;
44
55/// Specifies the formatting options to use when serializing.
66pub enum Format {
@@ -61,18 +61,43 @@ impl<T: ?Sized + serde::Serialize> Annotate for T {
6161}
6262
6363// We use a private trait to identify whether the Serializer passed to
64- // serde::Serialize for dyn Annotate is AnnotatedSerializer .
65- unsafe trait IsAnnotatedSerializer {
66- fn is_annotated_serializer ( & self ) -> bool ;
64+ // various functions is our Serializer .
65+ pub ( crate ) unsafe trait IsSerializer {
66+ fn is_serde_annotate ( & self ) -> bool ;
6767}
6868
69- unsafe impl < T : serde:: Serializer > IsAnnotatedSerializer for T {
70- default fn is_annotated_serializer ( & self ) -> bool {
69+ unsafe impl < T : serde:: Serializer > IsSerializer for T {
70+ default fn is_serde_annotate ( & self ) -> bool {
7171 false
7272 }
7373}
74- unsafe impl < ' a > IsAnnotatedSerializer for & mut AnnotatedSerializer < ' a > {
75- fn is_annotated_serializer ( & self ) -> bool {
74+
75+ unsafe impl < ' a > IsSerializer for & mut AnnotatedSerializer < ' a > {
76+ fn is_serde_annotate ( & self ) -> bool {
77+ true
78+ }
79+ }
80+
81+ // This marker trait is to avoid specifying lifetimes in the default
82+ // implementation. When I specify lifetimes in the default impl, the
83+ // compiler complains that the specialized impl repeats parameter `'de`.
84+ trait _IsDeserializer { }
85+ impl < ' de , T : serde:: Deserializer < ' de > > _IsDeserializer for T { }
86+
87+ // We use a private trait to identify whether the Deserializer passed to
88+ // various functions is our Deserializer.
89+ pub ( crate ) unsafe trait IsDeserializer {
90+ fn is_serde_annotate ( & self ) -> bool ;
91+ }
92+
93+ unsafe impl < T : _IsDeserializer > IsDeserializer for T {
94+ default fn is_serde_annotate ( & self ) -> bool {
95+ false
96+ }
97+ }
98+
99+ unsafe impl < ' de > IsDeserializer for & mut Deserializer < ' de > {
100+ fn is_serde_annotate ( & self ) -> bool {
76101 true
77102 }
78103}
@@ -89,7 +114,7 @@ unsafe impl<'a> IsAnnotatedSerializer for &mut AnnotatedSerializer<'a> {
89114// AnnotatedSerializer and just force the types with `transmute`.
90115impl serde:: Serialize for dyn Annotate {
91116 fn serialize < S : serde:: Serializer > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error > {
92- if !serializer. is_annotated_serializer ( ) {
117+ if !serializer. is_serde_annotate ( ) {
93118 panic ! (
94119 "Expected to be called by AnnotatedSerializer, not {:?}" ,
95120 std:: any:: type_name:: <S >( )
0 commit comments