1
- use std:: marker:: PhantomData ;
2
-
3
1
use access_manager_types:: { managed:: error:: AccessManagedError , CanCall , Selector } ;
4
- use cosmwasm_std:: {
5
- from_json, to_json_binary, Addr , DepsMut , Env , MessageInfo , StdError , SubMsg , WasmMsg ,
6
- } ;
2
+ use cosmwasm_std:: { to_json_binary, Addr , DepsMut , Env , MessageInfo , SubMsg , WasmMsg } ;
7
3
use depolama:: { StorageExt , Store } ;
8
- use serde:: {
9
- de:: { self , DeserializeOwned } ,
10
- Deserialize , Deserializer ,
11
- } ;
12
- use serde_json:: value:: RawValue ;
4
+ use serde:: { de:: DeserializeOwned , Deserialize , Deserializer , Serialize } ;
13
5
14
6
use crate :: { error:: ContractError , state:: ConsumingSchedule } ;
15
7
16
8
pub const ACCESS_MANAGED_CONSUME_SCHEDULED_OP_REPLY_ID : u64 = u64:: MAX ;
17
9
18
10
#[ derive( Debug ) ]
19
- pub struct Restricted < ' a , T : DeserializeOwned > {
20
- selector : & ' a Selector ,
21
- raw : & ' a RawValue ,
22
- __marker : PhantomData < fn ( ) -> T > ,
11
+ pub struct Restricted < T : DeserializeOwned + Serialize > {
12
+ selector : & ' static Selector ,
13
+ value : T ,
23
14
}
24
15
25
- impl < T : DeserializeOwned > Restricted < ' _ , T > {
26
- #[ allow( clippy:: needless_pass_by_value) ]
16
+ impl < T : DeserializeOwned + Serialize > Restricted < T > {
17
+ #[ allow( clippy:: needless_pass_by_value, clippy :: missing_panics_doc ) ]
27
18
pub fn ensure_can_call < S : Store < Key = ( ) , Value = Addr > > (
28
19
self ,
29
20
deps : DepsMut ,
@@ -45,7 +36,7 @@ impl<T: DeserializeOwned> Restricted<'_, T> {
45
36
) ?;
46
37
47
38
if immediate {
48
- Ok ( EnsureCanCallResult :: Msg ( self . deserialize_inner ( ) ? ) )
39
+ Ok ( EnsureCanCallResult :: Msg ( self . value ) )
49
40
} else if delay > 0 {
50
41
deps. storage . write_item :: < ConsumingSchedule > ( & true ) ;
51
42
@@ -56,15 +47,15 @@ impl<T: DeserializeOwned> Restricted<'_, T> {
56
47
msg : to_json_binary (
57
48
& access_manager_types:: manager:: msg:: ExecuteMsg :: ConsumeScheduledOp {
58
49
caller : info. sender . clone ( ) ,
59
- data : self . raw . get ( ) . to_owned ( ) ,
50
+ data : serde_json_wasm :: to_string ( & self . value ) . expect ( "infallible" ) ,
60
51
} ,
61
52
) ?,
62
53
funds : vec ! [ ] ,
63
54
} ) ,
64
- SubMsg :: reply_always (
55
+ SubMsg :: reply_on_success (
65
56
WasmMsg :: Execute {
66
57
contract_addr : env. contract . address . to_string ( ) ,
67
- msg : self . raw . get ( ) . as_bytes ( ) . into ( ) ,
58
+ msg : to_json_binary ( & self . value ) . expect ( "infallible" ) ,
68
59
funds : vec ! [ ] ,
69
60
} ,
70
61
ACCESS_MANAGED_CONSUME_SCHEDULED_OP_REPLY_ID ,
@@ -79,31 +70,23 @@ impl<T: DeserializeOwned> Restricted<'_, T> {
79
70
. into ( ) )
80
71
}
81
72
}
82
-
83
- fn deserialize_inner ( self ) -> Result < T , StdError > {
84
- from_json ( self . raw . get ( ) )
85
- }
86
73
}
87
74
88
75
pub enum EnsureCanCallResult < T > {
89
76
Msg ( T ) ,
90
77
Scheduled ( Vec < SubMsg > ) ,
91
78
}
92
79
93
- impl < ' de , T : DeserializeOwned > Deserialize < ' de > for Restricted < ' de , T > {
80
+ impl < ' de , T : DeserializeOwned + Serialize > Deserialize < ' de > for Restricted < T > {
94
81
fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
95
82
where
96
83
D : Deserializer < ' de > ,
97
84
{
98
- let raw = < & RawValue as Deserialize > :: deserialize ( deserializer) ?;
85
+ let value = T :: deserialize ( deserializer) ?;
99
86
100
- let selector = Selector :: extract ( raw . get ( ) ) . map_err ( de :: Error :: custom ) ? ;
87
+ let selector = Selector :: extract_from_serialize ( & value ) ;
101
88
102
- Ok ( Self {
103
- selector,
104
- raw,
105
- __marker : PhantomData ,
106
- } )
89
+ Ok ( Self { selector, value } )
107
90
}
108
91
}
109
92
@@ -123,7 +106,7 @@ mod tests {
123
106
#[ track_caller]
124
107
fn deser_expect_error ( json : & [ u8 ] , expect : & str ) {
125
108
assert_eq ! (
126
- serde_json :: from_slice:: <Restricted <ExecuteMsg >>( json)
109
+ serde_json_wasm :: from_slice:: <Restricted <ExecuteMsg >>( json)
127
110
. unwrap_err( )
128
111
. to_string( ) ,
129
112
expect
@@ -133,59 +116,55 @@ mod tests {
133
116
#[ test]
134
117
fn restricted_deser_ok ( ) {
135
118
let obj = br#"{"key":{}}"# ;
136
- let restricted = serde_json :: from_slice :: < Restricted < ExecuteMsg > > ( obj) . unwrap ( ) ;
119
+ let restricted = serde_json_wasm :: from_slice :: < Restricted < ExecuteMsg > > ( obj) . unwrap ( ) ;
137
120
138
121
assert_eq ! ( restricted. selector, Selector :: new( "key" ) ) ;
139
- assert_eq ! ( restricted. raw. get( ) . as_bytes( ) , obj) ;
140
-
141
- assert_eq ! ( restricted. deserialize_inner( ) . unwrap( ) , ExecuteMsg :: Key { } ) ;
122
+ assert_eq ! ( restricted. value, ExecuteMsg :: Key { } ) ;
142
123
}
143
124
144
125
#[ test]
145
126
fn restricted_deser_value_not_object_ok ( ) {
146
127
let obj = br#"{"key2":1}"# ;
147
- let restricted = serde_json :: from_slice :: < Restricted < ExecuteMsg > > ( obj) . unwrap ( ) ;
128
+ let restricted = serde_json_wasm :: from_slice :: < Restricted < ExecuteMsg > > ( obj) . unwrap ( ) ;
148
129
149
130
assert_eq ! ( restricted. selector, Selector :: new( "key2" ) ) ;
150
- assert_eq ! ( restricted. raw. get( ) . as_bytes( ) , obj) ;
151
-
152
- assert_eq ! ( restricted. deserialize_inner( ) . unwrap( ) , ExecuteMsg :: Key2 ( 1 ) ) ;
131
+ assert_eq ! ( restricted. value, ExecuteMsg :: Key2 ( 1 ) ) ;
153
132
}
154
133
155
134
#[ test]
156
- fn restricted_deser_escaped_fails ( ) {
135
+ fn restricted_deser_unknown_variant_fails ( ) {
157
136
deser_expect_error (
158
137
br#"{"key\n":{}}"# ,
159
- r#"invalid type: string " key\n" , expected a borrowed string at line 1 column 8"# ,
138
+ "unknown variant ` key\n ` , expected `key` or `key2`" ,
160
139
) ;
161
140
}
162
141
163
142
#[ test]
164
143
fn restricted_deser_multiple_keys_different_key_name_fails ( ) {
165
144
deser_expect_error (
166
145
br#"{"key":{},"key2":{}}"# ,
167
- "multiple keys found at line 1 column 16 " ,
146
+ "Expected this character to start a JSON value. " ,
168
147
) ;
169
148
}
170
149
171
150
#[ test]
172
151
fn restricted_deser_multiple_keys_same_key_name_fails ( ) {
173
152
deser_expect_error (
174
153
br#"{"key":{},"key":{}}"# ,
175
- "multiple keys found at line 1 column 15 " ,
154
+ "Expected this character to start a JSON value. " ,
176
155
) ;
177
156
}
178
157
179
158
#[ test]
180
159
fn restricted_deser_no_key ( ) {
181
- deser_expect_error ( br"{}" , "no key found at line 1 column 2 " ) ;
160
+ deser_expect_error ( br"{}" , "Invalid type " ) ;
182
161
}
183
162
184
163
#[ test]
185
164
fn restricted_deser_not_object ( ) {
186
165
deser_expect_error (
187
166
b"null" ,
188
- "invalid type: null, expected json object with single top level key at line 1 column 4 " ,
167
+ "Expected to parse either a `true`, `false`, or a `null`. " ,
189
168
) ;
190
169
}
191
170
}
0 commit comments