@@ -3,11 +3,9 @@ extern crate alloc;
3
3
use alloc:: format;
4
4
use alloc:: string:: String ;
5
5
6
- use serde:: Deserialize ;
7
- use serde_json as json;
8
-
9
6
#[ cfg( not( feature = "getrandom" ) ) ]
10
7
use crate :: sqlite;
8
+ use serde:: de:: Visitor ;
11
9
12
10
use uuid:: Uuid ;
13
11
@@ -46,25 +44,47 @@ pub fn deserialize_string_to_i64<'de, D>(deserializer: D) -> Result<i64, D::Erro
46
44
where
47
45
D : serde:: Deserializer < ' de > ,
48
46
{
49
- let value = json:: Value :: deserialize ( deserializer) ?;
50
-
51
- match value {
52
- json:: Value :: String ( s) => s. parse :: < i64 > ( ) . map_err ( serde:: de:: Error :: custom) ,
53
- _ => Err ( serde:: de:: Error :: custom ( "Expected a string." ) ) ,
54
- }
47
+ deserialize_optional_string_to_i64 ( deserializer) ?
48
+ . ok_or_else ( || serde:: de:: Error :: custom ( "Expected a string." ) )
55
49
}
56
50
57
51
pub fn deserialize_optional_string_to_i64 < ' de , D > ( deserializer : D ) -> Result < Option < i64 > , D :: Error >
58
52
where
59
53
D : serde:: Deserializer < ' de > ,
60
54
{
61
- let value = json:: Value :: deserialize ( deserializer) ?;
62
-
63
- match value {
64
- json:: Value :: Null => Ok ( None ) ,
65
- json:: Value :: String ( s) => s. parse :: < i64 > ( ) . map ( Some ) . map_err ( serde:: de:: Error :: custom) ,
66
- _ => Err ( serde:: de:: Error :: custom ( "Expected a string or null." ) ) ,
55
+ struct ValueVisitor ;
56
+
57
+ impl < ' de > Visitor < ' de > for ValueVisitor {
58
+ type Value = Option < i64 > ;
59
+
60
+ fn expecting ( & self , formatter : & mut core:: fmt:: Formatter ) -> core:: fmt:: Result {
61
+ formatter. write_str ( "a string or null" )
62
+ }
63
+
64
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
65
+ where
66
+ E : serde:: de:: Error ,
67
+ {
68
+ v. parse :: < i64 > ( ) . map ( Some ) . map_err ( serde:: de:: Error :: custom)
69
+ }
70
+
71
+ fn visit_none < E > ( self ) -> Result < Self :: Value , E >
72
+ where
73
+ E : serde:: de:: Error ,
74
+ {
75
+ Ok ( None )
76
+ }
77
+
78
+ fn visit_some < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
79
+ where
80
+ D : serde:: Deserializer < ' de > ,
81
+ {
82
+ deserializer. deserialize_str ( self )
83
+ }
67
84
}
85
+
86
+ // Using a custom visitor here to avoid an intermediate string allocation
87
+ deserializer. deserialize_option ( ValueVisitor )
68
88
}
69
89
70
90
// Use getrandom crate to generate UUID.
0 commit comments