@@ -13,7 +13,6 @@ use crate::prelude::*;
13
13
use core:: fmt;
14
14
use serde:: { de, Deserialize , Deserializer , Serialize , Serializer } ;
15
15
16
- #[ cfg( feature = "serde" ) ]
17
16
impl Serialize for Uuid {
18
17
fn serialize < S : Serializer > (
19
18
& self ,
@@ -28,11 +27,14 @@ impl Serialize for Uuid {
28
27
}
29
28
}
30
29
31
- #[ cfg( feature = "serde" ) ]
32
30
impl < ' de > Deserialize < ' de > for Uuid {
33
31
fn deserialize < D : Deserializer < ' de > > (
34
32
deserializer : D ,
35
33
) -> Result < Self , D :: Error > {
34
+ fn de_error < E : de:: Error > ( e : crate :: Error ) -> E {
35
+ E :: custom ( format_args ! ( "UUID parsing failed: {}" , e) )
36
+ }
37
+
36
38
if deserializer. is_human_readable ( ) {
37
39
struct UuidStringVisitor ;
38
40
@@ -50,14 +52,14 @@ impl<'de> Deserialize<'de> for Uuid {
50
52
self ,
51
53
value : & str ,
52
54
) -> Result < Uuid , E > {
53
- value. parse :: < Uuid > ( ) . map_err ( E :: custom )
55
+ value. parse :: < Uuid > ( ) . map_err ( de_error )
54
56
}
55
57
56
58
fn visit_bytes < E : de:: Error > (
57
59
self ,
58
60
value : & [ u8 ] ,
59
61
) -> Result < Uuid , E > {
60
- Uuid :: from_slice ( value) . map_err ( E :: custom )
62
+ Uuid :: from_slice ( value) . map_err ( de_error )
61
63
}
62
64
}
63
65
@@ -79,7 +81,7 @@ impl<'de> Deserialize<'de> for Uuid {
79
81
self ,
80
82
value : & [ u8 ] ,
81
83
) -> Result < Uuid , E > {
82
- Uuid :: from_slice ( value) . map_err ( E :: custom )
84
+ Uuid :: from_slice ( value) . map_err ( de_error )
83
85
}
84
86
}
85
87
@@ -88,33 +90,36 @@ impl<'de> Deserialize<'de> for Uuid {
88
90
}
89
91
}
90
92
91
- #[ cfg( all ( test, feature = "serde" ) ) ]
93
+ #[ cfg( test) ]
92
94
mod serde_tests {
93
- use serde_test;
95
+ use serde_test:: { Compact , Configure , Readable , Token } ;
94
96
95
97
use crate :: prelude:: * ;
96
98
97
99
#[ test]
98
100
fn test_serialize_readable ( ) {
99
- use serde_test:: Configure ;
100
-
101
101
let uuid_str = "f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4" ;
102
102
let u = Uuid :: parse_str ( uuid_str) . unwrap ( ) ;
103
- serde_test:: assert_tokens (
104
- & u. readable ( ) ,
105
- & [ serde_test:: Token :: Str ( uuid_str) ] ,
106
- ) ;
103
+ serde_test:: assert_tokens ( & u. readable ( ) , & [ Token :: Str ( uuid_str) ] ) ;
107
104
}
108
105
109
106
#[ test]
110
107
fn test_serialize_compact ( ) {
111
- use serde_test:: Configure ;
112
-
113
108
let uuid_bytes = b"F9168C5E-CEB2-4F" ;
114
109
let u = Uuid :: from_slice ( uuid_bytes) . unwrap ( ) ;
115
- serde_test:: assert_tokens (
116
- & u. compact ( ) ,
117
- & [ serde_test:: Token :: Bytes ( uuid_bytes) ] ,
110
+ serde_test:: assert_tokens ( & u. compact ( ) , & [ Token :: Bytes ( uuid_bytes) ] ) ;
111
+ }
112
+
113
+ #[ test]
114
+ fn test_de_failure ( ) {
115
+ serde_test:: assert_de_tokens_error :: < Readable < Uuid > > (
116
+ & [ Token :: Str ( "hello_world" ) ] ,
117
+ "UUID parsing failed: invalid length: expected one of [36, 32], found 11" ,
118
+ ) ;
119
+
120
+ serde_test:: assert_de_tokens_error :: < Compact < Uuid > > (
121
+ & [ Token :: Bytes ( b"hello_world" ) ] ,
122
+ "UUID parsing failed: invalid bytes length: expected 16, found 11" ,
118
123
) ;
119
124
}
120
125
}
0 commit comments