@@ -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,56 @@ 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) ?;
47
+ struct ValueVisitor ;
48
+
49
+ impl < ' de > Visitor < ' de > for ValueVisitor {
50
+ type Value = i64 ;
51
+
52
+ fn expecting ( & self , formatter : & mut core:: fmt:: Formatter ) -> core:: fmt:: Result {
53
+ formatter. write_str ( "a string representation of a number" )
54
+ }
50
55
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." ) ) ,
56
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
57
+ where
58
+ E : serde:: de:: Error ,
59
+ {
60
+ v. parse :: < i64 > ( ) . map_err ( serde:: de:: Error :: custom)
61
+ }
54
62
}
63
+
64
+ // Using a custom visitor here to avoid an intermediate string allocation
65
+ deserializer. deserialize_str ( ValueVisitor )
55
66
}
56
67
57
68
pub fn deserialize_optional_string_to_i64 < ' de , D > ( deserializer : D ) -> Result < Option < i64 > , D :: Error >
58
69
where
59
70
D : serde:: Deserializer < ' de > ,
60
71
{
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." ) ) ,
72
+ struct ValueVisitor ;
73
+
74
+ impl < ' de > Visitor < ' de > for ValueVisitor {
75
+ type Value = Option < i64 > ;
76
+
77
+ fn expecting ( & self , formatter : & mut core:: fmt:: Formatter ) -> core:: fmt:: Result {
78
+ formatter. write_str ( "a string or null" )
79
+ }
80
+
81
+ fn visit_none < E > ( self ) -> Result < Self :: Value , E >
82
+ where
83
+ E : serde:: de:: Error ,
84
+ {
85
+ Ok ( None )
86
+ }
87
+
88
+ fn visit_some < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
89
+ where
90
+ D : serde:: Deserializer < ' de > ,
91
+ {
92
+ Ok ( Some ( deserialize_string_to_i64 ( deserializer) ?) )
93
+ }
67
94
}
95
+
96
+ deserializer. deserialize_option ( ValueVisitor )
68
97
}
69
98
70
99
// Use getrandom crate to generate UUID.
0 commit comments