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