@@ -200,19 +200,27 @@ fn pp_defs<'a>(
200
200
env : & ' a TypeEnv ,
201
201
def_list : & ' a [ & ' a str ] ,
202
202
recs : & ' a BTreeSet < & ' a str > ,
203
+ export : bool ,
203
204
) -> RcDoc < ' a > {
204
- let recs_doc = lines (
205
- recs. iter ( )
206
- . map ( |id| kwd ( "const" ) . append ( ident ( id) ) . append ( " = IDL.Rec();" ) ) ,
207
- ) ;
205
+ let export_prefix = if export { str ( "export " ) } else { RcDoc :: nil ( ) } ;
206
+
207
+ let recs_doc = lines ( recs. iter ( ) . map ( |id| {
208
+ export_prefix
209
+ . clone ( )
210
+ . append ( kwd ( "const" ) )
211
+ . append ( ident ( id) )
212
+ . append ( " = IDL.Rec();" )
213
+ } ) ) ;
208
214
let defs = lines ( def_list. iter ( ) . map ( |id| {
209
215
let ty = env. find_type ( id) . unwrap ( ) ;
210
216
if recs. contains ( id) {
211
217
ident ( id)
212
218
. append ( ".fill" )
213
219
. append ( enclose ( "(" , pp_ty ( ty) , ");" ) )
214
220
} else {
215
- kwd ( "const" )
221
+ export_prefix
222
+ . clone ( )
223
+ . append ( kwd ( "const" ) )
216
224
. append ( ident ( id) )
217
225
. append ( " = " )
218
226
. append ( pp_ty ( ty) )
@@ -237,38 +245,86 @@ fn pp_actor<'a>(ty: &'a Type, recs: &'a BTreeSet<&'a str>) -> RcDoc<'a> {
237
245
}
238
246
}
239
247
248
+ pub fn pp_deprecation_comment < ' a > ( ) -> RcDoc < ' a > {
249
+ str ( "/**" ) . append ( RcDoc :: hardline ( ) )
250
+ . append ( " * @deprecated Since `@dfinity/candid` v3.2.1, you can import IDL types directly from this module instead of using this factory function." )
251
+ . append ( RcDoc :: hardline ( ) )
252
+ . append ( " */" )
253
+ . append ( RcDoc :: hardline ( ) )
254
+ }
255
+
240
256
pub fn compile ( env : & TypeEnv , actor : & Option < Type > ) -> String {
241
257
match actor {
242
258
None => {
243
259
let def_list: Vec < _ > = env. 0 . iter ( ) . map ( |pair| pair. 0 . as_ref ( ) ) . collect ( ) ;
244
260
let recs = infer_rec ( env, & def_list) . unwrap ( ) ;
245
- let doc = pp_defs ( env, & def_list, & recs) ;
246
- doc. pretty ( LINE_WIDTH ) . to_string ( )
261
+ let import_doc = str ( "import { IDL } from '@dfinity/candid';" ) ;
262
+ let doc = pp_defs ( env, & def_list, & recs, true ) ;
263
+ let result = import_doc
264
+ . append ( RcDoc :: hardline ( ) )
265
+ . append ( RcDoc :: hardline ( ) )
266
+ . append ( doc)
267
+ . pretty ( LINE_WIDTH )
268
+ . to_string ( ) ;
269
+
270
+ result
247
271
}
248
272
Some ( actor) => {
249
273
let def_list = chase_actor ( env, actor) . unwrap ( ) ;
250
274
let recs = infer_rec ( env, & def_list) . unwrap ( ) ;
251
- let defs = pp_defs ( env, & def_list, & recs) ;
252
275
let init = if let TypeInner :: Class ( ref args, _) = actor. as_ref ( ) {
253
276
args. as_slice ( )
254
277
} else {
255
278
& [ ] [ ..]
256
279
} ;
257
- let actor = kwd ( "return" ) . append ( pp_actor ( actor, & recs) ) . append ( ";" ) ;
258
- let body = defs. append ( actor) ;
259
- let doc = str ( "export const idlFactory = ({ IDL }) => " )
260
- . append ( enclose_space ( "{" , body, "};" ) ) ;
261
- // export init args
262
- let init_defs = chase_types ( env, init) . unwrap ( ) ;
280
+ let init_types: Vec < Type > = init. iter ( ) . map ( |a| a. clone ( ) ) . collect ( ) ;
281
+
282
+ let import_doc = str ( "import { IDL } from '@dfinity/candid';" ) ;
283
+ let defs = pp_defs ( env, & def_list, & recs, true ) ;
284
+ let actor = pp_actor ( actor, & recs) ;
285
+
286
+ let idl_service = str ( "export const idlService = " )
287
+ . append ( actor. clone ( ) )
288
+ . append ( ";" ) ;
289
+
290
+ let idl_init_args = str ( "export const idlInitArgs = " )
291
+ . append ( pp_rets ( & init_types) )
292
+ . append ( ";" ) ;
293
+
294
+ let idl_factory_return = kwd ( "return" ) . append ( actor) . append ( ";" ) ;
295
+ let idl_factory_body = pp_defs ( env, & def_list, & recs, false ) . append ( idl_factory_return) ;
296
+ let idl_factory_doc = pp_deprecation_comment ( )
297
+ . append ( str ( "export const idlFactory = ({ IDL }) => " ) )
298
+ . append ( enclose_space ( "{" , idl_factory_body, "};" ) ) ;
299
+
300
+ let init_defs = chase_types ( env, & init_types) . unwrap ( ) ;
263
301
let init_recs = infer_rec ( env, & init_defs) . unwrap ( ) ;
264
- let init_defs_doc = pp_defs ( env, & init_defs, & init_recs) ;
265
- let init_doc = kwd ( "return" ) . append ( pp_rets ( init) ) . append ( ";" ) ;
302
+ let init_defs_refs: Vec < & str > = init_defs. iter ( ) . map ( |s| * s) . collect ( ) ;
303
+ let init_defs_doc = pp_defs ( env, & init_defs_refs, & init_recs, false ) ;
304
+ let init_doc = kwd ( "return" ) . append ( pp_rets ( & init_types) ) . append ( ";" ) ;
266
305
let init_doc = init_defs_doc. append ( init_doc) ;
267
- let init_doc =
268
- str ( "export const init = ({ IDL }) => " ) . append ( enclose_space ( "{" , init_doc, "};" ) ) ;
306
+ let init_doc = pp_deprecation_comment ( )
307
+ . append ( str ( "export const init = ({ IDL }) => " ) )
308
+ . append ( enclose_space ( "{" , init_doc, "};" ) ) ;
269
309
let init_doc = init_doc. pretty ( LINE_WIDTH ) . to_string ( ) ;
270
- let doc = doc. append ( RcDoc :: hardline ( ) ) . append ( init_doc) ;
271
- doc. pretty ( LINE_WIDTH ) . to_string ( )
310
+
311
+ let result = import_doc
312
+ . append ( RcDoc :: hardline ( ) )
313
+ . append ( RcDoc :: hardline ( ) )
314
+ . append ( defs)
315
+ . append ( RcDoc :: hardline ( ) )
316
+ . append ( idl_service)
317
+ . append ( RcDoc :: hardline ( ) )
318
+ . append ( RcDoc :: hardline ( ) )
319
+ . append ( idl_init_args)
320
+ . append ( RcDoc :: hardline ( ) )
321
+ . append ( RcDoc :: hardline ( ) )
322
+ . append ( idl_factory_doc)
323
+ . append ( RcDoc :: hardline ( ) )
324
+ . append ( RcDoc :: hardline ( ) )
325
+ . append ( init_doc) ;
326
+
327
+ result. pretty ( LINE_WIDTH ) . to_string ( )
272
328
}
273
329
}
274
330
}
0 commit comments