@@ -5,7 +5,7 @@ use colored::Colorize;
5
5
use itertools:: Itertools ;
6
6
use move_binary_format:: file_format:: { Ability , AbilitySet , DatatypeTyParameter , Visibility } ;
7
7
use move_binary_format:: normalized:: {
8
- Enum as NormalizedEnum , Field as NormalizedField , Function as SuiNormalizedFunction ,
8
+ self , Enum as NormalizedEnum , Field as NormalizedField , Function as NormalizedFunction ,
9
9
Module as NormalizedModule , Struct as NormalizedStruct , Type as NormalizedType ,
10
10
} ;
11
11
use move_core_types:: annotated_value:: { MoveStruct , MoveValue , MoveVariant } ;
@@ -91,19 +91,25 @@ pub enum SuiMoveNormalizedType {
91
91
U256 ,
92
92
Address ,
93
93
Signer ,
94
- #[ serde( rename_all = "camelCase" ) ]
95
94
Struct {
96
- address : String ,
97
- module : String ,
98
- name : String ,
99
- type_arguments : Vec < SuiMoveNormalizedType > ,
95
+ #[ serde( flatten) ]
96
+ inner : Box < SuiMoveNormalizedStructType > ,
100
97
} ,
101
98
Vector ( Box < SuiMoveNormalizedType > ) ,
102
99
TypeParameter ( SuiMoveTypeParameterIndex ) ,
103
100
Reference ( Box < SuiMoveNormalizedType > ) ,
104
101
MutableReference ( Box < SuiMoveNormalizedType > ) ,
105
102
}
106
103
104
+ #[ derive( Serialize , Deserialize , Debug , JsonSchema , Clone ) ]
105
+ #[ serde( rename_all = "camelCase" ) ]
106
+ pub struct SuiMoveNormalizedStructType {
107
+ pub address : String ,
108
+ pub module : String ,
109
+ pub name : String ,
110
+ pub type_arguments : Vec < SuiMoveNormalizedType > ,
111
+ }
112
+
107
113
#[ derive( Serialize , Deserialize , Debug , JsonSchema , Clone ) ]
108
114
#[ serde( rename_all = "camelCase" ) ]
109
115
pub struct SuiMoveNormalizedFunction {
@@ -141,45 +147,53 @@ impl PartialEq for SuiMoveNormalizedModule {
141
147
}
142
148
}
143
149
144
- impl From < NormalizedModule > for SuiMoveNormalizedModule {
145
- fn from ( module : NormalizedModule ) -> Self {
150
+ impl < S : std :: hash :: Hash + Eq + ToString > From < & NormalizedModule < S > > for SuiMoveNormalizedModule {
151
+ fn from ( module : & NormalizedModule < S > ) -> Self {
146
152
Self {
147
153
file_format_version : module. file_format_version ,
148
- address : module. address . to_hex_literal ( ) ,
149
- name : module. name . to_string ( ) ,
154
+ address : module. address ( ) . to_hex_literal ( ) ,
155
+ name : module. name ( ) . to_string ( ) ,
150
156
friends : module
151
157
. friends
152
- . into_iter ( )
158
+ . iter ( )
153
159
. map ( |module_id| SuiMoveModuleId {
154
- address : module_id. address ( ) . to_hex_literal ( ) ,
155
- name : module_id. name ( ) . to_string ( ) ,
160
+ address : module_id. address . to_hex_literal ( ) ,
161
+ name : module_id. name . to_string ( ) ,
156
162
} )
157
163
. collect :: < Vec < SuiMoveModuleId > > ( ) ,
158
164
structs : module
159
165
. structs
160
- . into_iter ( )
161
- . map ( |( name, struct_) | ( name. to_string ( ) , SuiMoveNormalizedStruct :: from ( struct_) ) )
166
+ . iter ( )
167
+ . map ( |( name, struct_) | {
168
+ ( name. to_string ( ) , SuiMoveNormalizedStruct :: from ( & * * struct_) )
169
+ } )
162
170
. collect :: < BTreeMap < String , SuiMoveNormalizedStruct > > ( ) ,
163
171
enums : module
164
172
. enums
165
- . into_iter ( )
166
- . map ( |( name, enum_) | ( name. to_string ( ) , SuiMoveNormalizedEnum :: from ( enum_) ) )
173
+ . iter ( )
174
+ . map ( |( name, enum_) | ( name. to_string ( ) , SuiMoveNormalizedEnum :: from ( & * * enum_) ) )
167
175
. collect ( ) ,
168
176
exposed_functions : module
169
177
. functions
170
- . into_iter ( )
171
- . filter_map ( |( name, function) | {
178
+ . iter ( )
179
+ . filter ( |( _name, function) | {
180
+ function. is_entry || function. visibility != Visibility :: Private
181
+ } )
182
+ . map ( |( name, function) | {
172
183
// TODO: Do we want to expose the private functions as well?
173
- ( function. is_entry || function. visibility != Visibility :: Private )
174
- . then ( || ( name. to_string ( ) , SuiMoveNormalizedFunction :: from ( function) ) )
184
+
185
+ (
186
+ name. to_string ( ) ,
187
+ SuiMoveNormalizedFunction :: from ( & * * function) ,
188
+ )
175
189
} )
176
190
. collect :: < BTreeMap < String , SuiMoveNormalizedFunction > > ( ) ,
177
191
}
178
192
}
179
193
}
180
194
181
- impl From < SuiNormalizedFunction > for SuiMoveNormalizedFunction {
182
- fn from ( function : SuiNormalizedFunction ) -> Self {
195
+ impl < S : ToString > From < & NormalizedFunction < S > > for SuiMoveNormalizedFunction {
196
+ fn from ( function : & NormalizedFunction < S > ) -> Self {
183
197
Self {
184
198
visibility : match function. visibility {
185
199
Visibility :: Private => SuiMoveVisibility :: Private ,
@@ -189,59 +203,62 @@ impl From<SuiNormalizedFunction> for SuiMoveNormalizedFunction {
189
203
is_entry : function. is_entry ,
190
204
type_parameters : function
191
205
. type_parameters
192
- . into_iter ( )
206
+ . iter ( )
207
+ . copied ( )
193
208
. map ( |a| a. into ( ) )
194
209
. collect :: < Vec < SuiMoveAbilitySet > > ( ) ,
195
210
parameters : function
196
211
. parameters
197
- . into_iter ( )
198
- . map ( SuiMoveNormalizedType :: from)
212
+ . iter ( )
213
+ . map ( |t| SuiMoveNormalizedType :: from ( & * * t ) )
199
214
. collect :: < Vec < SuiMoveNormalizedType > > ( ) ,
200
215
return_ : function
201
216
. return_
202
- . into_iter ( )
203
- . map ( SuiMoveNormalizedType :: from)
217
+ . iter ( )
218
+ . map ( |t| SuiMoveNormalizedType :: from ( & * * t ) )
204
219
. collect :: < Vec < SuiMoveNormalizedType > > ( ) ,
205
220
}
206
221
}
207
222
}
208
223
209
- impl From < NormalizedStruct > for SuiMoveNormalizedStruct {
210
- fn from ( struct_ : NormalizedStruct ) -> Self {
224
+ impl < S : ToString > From < & NormalizedStruct < S > > for SuiMoveNormalizedStruct {
225
+ fn from ( struct_ : & NormalizedStruct < S > ) -> Self {
211
226
Self {
212
227
abilities : struct_. abilities . into ( ) ,
213
228
type_parameters : struct_
214
229
. type_parameters
215
- . into_iter ( )
230
+ . iter ( )
231
+ . copied ( )
216
232
. map ( SuiMoveStructTypeParameter :: from)
217
233
. collect :: < Vec < SuiMoveStructTypeParameter > > ( ) ,
218
234
fields : struct_
219
235
. fields
220
- . into_iter ( )
221
- . map ( SuiMoveNormalizedField :: from)
236
+ . iter ( )
237
+ . map ( |f| SuiMoveNormalizedField :: from ( & * * f ) )
222
238
. collect :: < Vec < SuiMoveNormalizedField > > ( ) ,
223
239
}
224
240
}
225
241
}
226
242
227
- impl From < NormalizedEnum > for SuiMoveNormalizedEnum {
228
- fn from ( value : NormalizedEnum ) -> Self {
243
+ impl < S : ToString > From < & NormalizedEnum < S > > for SuiMoveNormalizedEnum {
244
+ fn from ( value : & NormalizedEnum < S > ) -> Self {
229
245
Self {
230
246
abilities : value. abilities . into ( ) ,
231
247
type_parameters : value
232
248
. type_parameters
233
- . into_iter ( )
249
+ . iter ( )
250
+ . copied ( )
234
251
. map ( SuiMoveStructTypeParameter :: from)
235
252
. collect :: < Vec < SuiMoveStructTypeParameter > > ( ) ,
236
253
variants : value
237
254
. variants
238
- . into_iter ( )
255
+ . iter ( )
239
256
. map ( |variant| {
240
257
(
241
258
variant. name . to_string ( ) ,
242
259
variant
243
260
. fields
244
- . into_iter ( )
261
+ . iter ( )
245
262
. map ( SuiMoveNormalizedField :: from)
246
263
. collect :: < Vec < SuiMoveNormalizedField > > ( ) ,
247
264
)
@@ -260,17 +277,17 @@ impl From<DatatypeTyParameter> for SuiMoveStructTypeParameter {
260
277
}
261
278
}
262
279
263
- impl From < NormalizedField > for SuiMoveNormalizedField {
264
- fn from ( normalized_field : NormalizedField ) -> Self {
280
+ impl < S : ToString > From < & NormalizedField < S > > for SuiMoveNormalizedField {
281
+ fn from ( normalized_field : & NormalizedField < S > ) -> Self {
265
282
Self {
266
283
name : normalized_field. name . to_string ( ) ,
267
- type_ : SuiMoveNormalizedType :: from ( normalized_field. type_ ) ,
284
+ type_ : SuiMoveNormalizedType :: from ( & normalized_field. type_ ) ,
268
285
}
269
286
}
270
287
}
271
288
272
- impl From < NormalizedType > for SuiMoveNormalizedType {
273
- fn from ( type_ : NormalizedType ) -> Self {
289
+ impl < S : ToString > From < & NormalizedType < S > > for SuiMoveNormalizedType {
290
+ fn from ( type_ : & NormalizedType < S > ) -> Self {
274
291
match type_ {
275
292
NormalizedType :: Bool => SuiMoveNormalizedType :: Bool ,
276
293
NormalizedType :: U8 => SuiMoveNormalizedType :: U8 ,
@@ -281,30 +298,32 @@ impl From<NormalizedType> for SuiMoveNormalizedType {
281
298
NormalizedType :: U256 => SuiMoveNormalizedType :: U256 ,
282
299
NormalizedType :: Address => SuiMoveNormalizedType :: Address ,
283
300
NormalizedType :: Signer => SuiMoveNormalizedType :: Signer ,
284
- NormalizedType :: Struct {
285
- address,
286
- module,
287
- name,
288
- type_arguments,
289
- } => SuiMoveNormalizedType :: Struct {
290
- address : address. to_hex_literal ( ) ,
291
- module : module. to_string ( ) ,
292
- name : name. to_string ( ) ,
293
- type_arguments : type_arguments
294
- . into_iter ( )
295
- . map ( SuiMoveNormalizedType :: from)
296
- . collect :: < Vec < SuiMoveNormalizedType > > ( ) ,
297
- } ,
298
- NormalizedType :: Vector ( v) => {
299
- SuiMoveNormalizedType :: Vector ( Box :: new ( SuiMoveNormalizedType :: from ( * v) ) )
301
+ NormalizedType :: Datatype ( dt) => {
302
+ let normalized:: Datatype {
303
+ module,
304
+ name,
305
+ type_arguments,
306
+ } = & * * dt;
307
+ SuiMoveNormalizedType :: new_struct (
308
+ module. address . to_hex_literal ( ) ,
309
+ module. name . to_string ( ) ,
310
+ name. to_string ( ) ,
311
+ type_arguments
312
+ . iter ( )
313
+ . map ( SuiMoveNormalizedType :: from)
314
+ . collect :: < Vec < SuiMoveNormalizedType > > ( ) ,
315
+ )
300
316
}
301
- NormalizedType :: TypeParameter ( t) => SuiMoveNormalizedType :: TypeParameter ( t) ,
302
- NormalizedType :: Reference ( r) => {
303
- SuiMoveNormalizedType :: Reference ( Box :: new ( SuiMoveNormalizedType :: from ( * r) ) )
317
+ NormalizedType :: Vector ( v) => {
318
+ SuiMoveNormalizedType :: Vector ( Box :: new ( SuiMoveNormalizedType :: from ( & * * v) ) )
304
319
}
305
- NormalizedType :: MutableReference ( mr) => {
306
- SuiMoveNormalizedType :: MutableReference ( Box :: new ( SuiMoveNormalizedType :: from ( * mr) ) )
320
+ NormalizedType :: TypeParameter ( t) => SuiMoveNormalizedType :: TypeParameter ( * t) ,
321
+ NormalizedType :: Reference ( false , r) => {
322
+ SuiMoveNormalizedType :: Reference ( Box :: new ( SuiMoveNormalizedType :: from ( & * * r) ) )
307
323
}
324
+ NormalizedType :: Reference ( true , mr) => SuiMoveNormalizedType :: MutableReference (
325
+ Box :: new ( SuiMoveNormalizedType :: from ( & * * mr) ) ,
326
+ ) ,
308
327
}
309
328
}
310
329
}
@@ -325,6 +344,24 @@ impl From<AbilitySet> for SuiMoveAbilitySet {
325
344
}
326
345
}
327
346
347
+ impl SuiMoveNormalizedType {
348
+ pub fn new_struct (
349
+ address : String ,
350
+ module : String ,
351
+ name : String ,
352
+ type_arguments : Vec < SuiMoveNormalizedType > ,
353
+ ) -> Self {
354
+ SuiMoveNormalizedType :: Struct {
355
+ inner : Box :: new ( SuiMoveNormalizedStructType {
356
+ address,
357
+ module,
358
+ name,
359
+ type_arguments,
360
+ } ) ,
361
+ }
362
+ }
363
+ }
364
+
328
365
#[ derive( Serialize , Deserialize , Debug , JsonSchema , Clone ) ]
329
366
pub enum ObjectValueKind {
330
367
ByImmutableReference ,
@@ -653,3 +690,8 @@ impl From<MoveStruct> for SuiMoveStruct {
653
690
}
654
691
}
655
692
}
693
+
694
+ #[ test]
695
+ fn enum_size ( ) {
696
+ assert_eq ! ( std:: mem:: size_of:: <SuiMoveNormalizedType >( ) , 16 ) ;
697
+ }
0 commit comments