@@ -87,3 +87,80 @@ impl<'de> Deserialize<'de> for bool {
87
87
reader. deserialize_any ( BoolVisitor )
88
88
}
89
89
}
90
+
91
+ macro_rules! impl_serialize_for_nonzero_primitive {
92
+ ( $( $t: ty) ,* ) => {
93
+ $(
94
+ impl Serialize for $t {
95
+ fn serialize<S : Serializer >( & self , serializer: S ) -> Result <S :: Ok , S :: Error > {
96
+ serializer. serialize_text( self . get( ) . to_string( ) )
97
+ }
98
+ }
99
+ ) *
100
+ } ;
101
+ }
102
+
103
+ impl_serialize_for_nonzero_primitive ! (
104
+ core:: num:: NonZeroU8 ,
105
+ core:: num:: NonZeroU16 ,
106
+ core:: num:: NonZeroU32 ,
107
+ core:: num:: NonZeroU64 ,
108
+ core:: num:: NonZeroU128 ,
109
+ core:: num:: NonZeroI8 ,
110
+ core:: num:: NonZeroI16 ,
111
+ core:: num:: NonZeroI32 ,
112
+ core:: num:: NonZeroI64 ,
113
+ core:: num:: NonZeroI128
114
+ ) ;
115
+
116
+ macro_rules! impl_deserialize_for_nonzero_primitive {
117
+ ( $( $t: ty) ,* ) => {
118
+ $(
119
+ impl <' de> Deserialize <' de> for $t {
120
+ fn deserialize<D : Deserializer <' de>>( reader: D ) -> Result <Self , D :: Error > {
121
+ let value = Deserialize :: <' de>:: deserialize( reader) ?;
122
+ <$t>:: new( value) . ok_or_else( || de:: Error :: custom( "value cannot be zero" ) )
123
+ }
124
+ }
125
+ ) *
126
+ } ;
127
+ }
128
+
129
+ impl_deserialize_for_nonzero_primitive ! (
130
+ core:: num:: NonZeroU8 ,
131
+ core:: num:: NonZeroU16 ,
132
+ core:: num:: NonZeroU32 ,
133
+ core:: num:: NonZeroU64 ,
134
+ core:: num:: NonZeroU128 ,
135
+ core:: num:: NonZeroI8 ,
136
+ core:: num:: NonZeroI16 ,
137
+ core:: num:: NonZeroI32 ,
138
+ core:: num:: NonZeroI64 ,
139
+ core:: num:: NonZeroI128
140
+ ) ;
141
+
142
+ #[ cfg( test) ]
143
+ mod tests {
144
+ use crate :: value:: XmlText ;
145
+
146
+ use super :: * ;
147
+
148
+ #[ test]
149
+ fn test_de_serialize_non_zero_i8 ( ) {
150
+ let value = XmlText :: new ( "42" ) ;
151
+
152
+ let result = <core:: num:: NonZeroI8 >:: deserialize ( & value) ;
153
+
154
+ let result = result. expect ( "deserialize should not fail" ) ;
155
+ assert_eq ! ( result. get( ) , 42 ) ;
156
+ }
157
+
158
+ #[ test]
159
+ fn test_de_serialize_non_zero_i8_zero_value ( ) {
160
+ let value = XmlText :: new ( "0" ) ;
161
+
162
+ let result = <core:: num:: NonZeroI8 >:: deserialize ( & value) ;
163
+
164
+ let _err = result. expect_err ( "deserialize should fail" ) ;
165
+ }
166
+ }
0 commit comments