@@ -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,84 @@ fn pp_actor<'a>(ty: &'a Type, recs: &'a BTreeSet<&'a str>) -> RcDoc<'a> {
237
245
}
238
246
}
239
247
248
+ fn pp_deprecation_comment < ' a > ( ) -> RcDoc < ' a > {
249
+ str ( "/**" ) . append ( RcDoc :: hardline ( ) )
250
+ . append ( " * @deprecated 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
280
+
281
+ let import_doc = str ( "import { IDL } from '@dfinity/candid';" ) ;
282
+ let defs = pp_defs ( env, & def_list, & recs, true ) ;
283
+ let actor = pp_actor ( actor, & recs) ;
284
+
285
+ let idl_service = str ( "export const idlService = " )
286
+ . append ( actor. clone ( ) )
287
+ . append ( ";" ) ;
288
+
289
+ let idl_init_args = str ( "export const idlInitArgs = " )
290
+ . append ( pp_rets ( init) )
291
+ . append ( ";" ) ;
292
+
293
+ let idl_factory_return = kwd ( "return" ) . append ( actor) . append ( ";" ) ;
294
+ let idl_factory_body = pp_defs ( env, & def_list, & recs, false ) . append ( idl_factory_return) ;
295
+ let idl_factory_doc = pp_deprecation_comment ( )
296
+ . append ( str ( "export const idlFactory = ({ IDL }) => " ) )
297
+ . append ( enclose_space ( "{" , idl_factory_body, "};" ) ) ;
298
+
262
299
let init_defs = chase_types ( env, init) . unwrap ( ) ;
263
300
let init_recs = infer_rec ( env, & init_defs) . unwrap ( ) ;
264
- let init_defs_doc = pp_defs ( env, & init_defs, & init_recs) ;
301
+ let init_defs_doc = pp_defs ( env, & init_defs, & init_recs, false ) ;
265
302
let init_doc = kwd ( "return" ) . append ( pp_rets ( init) ) . append ( ";" ) ;
266
303
let init_doc = init_defs_doc. append ( init_doc) ;
267
- let init_doc =
268
- str ( "export const init = ({ IDL }) => " ) . append ( enclose_space ( "{" , init_doc, "};" ) ) ;
304
+ let init_doc = pp_deprecation_comment ( )
305
+ . append ( str ( "export const init = ({ IDL }) => " ) )
306
+ . append ( enclose_space ( "{" , init_doc, "};" ) ) ;
269
307
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 ( )
308
+
309
+ let result = import_doc
310
+ . append ( RcDoc :: hardline ( ) )
311
+ . append ( RcDoc :: hardline ( ) )
312
+ . append ( defs)
313
+ . append ( RcDoc :: hardline ( ) )
314
+ . append ( idl_service)
315
+ . append ( RcDoc :: hardline ( ) )
316
+ . append ( RcDoc :: hardline ( ) )
317
+ . append ( idl_init_args)
318
+ . append ( RcDoc :: hardline ( ) )
319
+ . append ( RcDoc :: hardline ( ) )
320
+ . append ( idl_factory_doc)
321
+ . append ( RcDoc :: hardline ( ) )
322
+ . append ( RcDoc :: hardline ( ) )
323
+ . append ( init_doc) ;
324
+
325
+ result. pretty ( LINE_WIDTH ) . to_string ( )
272
326
}
273
327
}
274
328
}
0 commit comments