5
5
// It can be operated on (e.g. INCR) and serialized back to JSON.
6
6
7
7
use serde_json:: Value ;
8
- use jsonpath:: Selector ;
8
+ use jsonpath_lib as jsonpath;
9
9
10
10
pub struct Error {
11
11
msg : String ,
12
12
}
13
13
14
+ impl From < String > for Error {
15
+ fn from ( e : String ) -> Self {
16
+ Error { msg : e }
17
+ }
18
+ }
19
+
14
20
impl From < serde_json:: Error > for Error {
15
21
fn from ( e : serde_json:: Error ) -> Self {
16
- Error { msg : format ! ( "{}" , e. to_string( ) ) }
22
+ Error { msg : e. to_string ( ) }
17
23
}
18
24
}
19
25
@@ -52,49 +58,31 @@ impl RedisJSON {
52
58
pub fn to_string ( & self , path : & str ) -> Result < String , Error > {
53
59
eprintln ! ( "Serializing back to JSON" ) ;
54
60
55
- let s = match self . get_doc ( path) ? {
56
- Some ( doc) => serde_json:: to_string ( & doc) ?,
57
- None => String :: new ( )
58
- } ;
59
-
60
- Ok ( s)
61
+ let results = self . get_doc ( path) ?;
62
+ Ok ( serde_json:: to_string ( & results) ?)
61
63
}
62
64
63
65
pub fn str_len ( & self , path : & str ) -> Result < usize , Error > {
64
- match self . get_doc ( path) ? {
65
- Some ( doc) => {
66
- match doc. as_str ( ) {
67
- Some ( s) => Ok ( s. len ( ) ) ,
68
- None => Err ( Error { msg : "ERR wrong type of path value" . to_string ( ) } )
69
- }
70
- }
71
- None => Ok ( 0 ) // path not found
66
+ match self . get_doc ( path) ?. as_str ( ) {
67
+ Some ( s) => Ok ( s. len ( ) ) ,
68
+ None => Err ( Error { msg : "ERR wrong type of path value" . to_string ( ) } )
72
69
}
73
70
}
74
71
75
72
pub fn get_type ( & self , path : & str ) -> Result < String , Error > {
76
73
let s = match self . get_doc ( path) ? {
77
- Some ( doc) => {
78
- match doc {
79
- Value :: Null => "null" ,
80
- Value :: Bool ( _) => "boolean" ,
81
- Value :: Number ( _) => "number" ,
82
- Value :: String ( _) => "string" ,
83
- Value :: Array ( _) => "array" ,
84
- Value :: Object ( _) => "object" ,
85
- }
86
- }
87
- None => ""
74
+ Value :: Null => "null" ,
75
+ Value :: Bool ( _) => "boolean" ,
76
+ Value :: Number ( _) => "number" ,
77
+ Value :: String ( _) => "string" ,
78
+ Value :: Array ( _) => "array" ,
79
+ Value :: Object ( _) => "object" ,
88
80
} ;
89
81
Ok ( s. to_string ( ) )
90
82
}
91
83
92
- pub fn get_doc ( & self , path : & str ) -> Result < Option < & Value > , Error > {
93
- // Create a JSONPath selector
94
- let selector = Selector :: new ( path) . map_err ( |e| Error {
95
- msg : format ! ( "{}" , e) ,
96
- } ) ?;
97
-
98
- Ok ( selector. find ( & self . data ) . next ( ) )
84
+ pub fn get_doc ( & self , path : & str ) -> Result < Value , Error > {
85
+ let results = jsonpath:: select ( & self . data , path) ?;
86
+ Ok ( results)
99
87
}
100
88
}
0 commit comments