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