@@ -193,19 +193,27 @@ fn pp_defs<'a>(
193193 env : & ' a TypeEnv ,
194194 def_list : & ' a [ & ' a str ] ,
195195 recs : & ' a BTreeSet < & ' a str > ,
196+ export : bool ,
196197) -> 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+ } ) ) ;
201207 let defs = lines ( def_list. iter ( ) . map ( |& id| {
202208 let ty = env. find_type ( & id. into ( ) ) . unwrap ( ) ;
203209 if recs. contains ( id) {
204210 ident ( id)
205211 . append ( ".fill" )
206212 . append ( enclose ( "(" , pp_ty ( ty) , ");" ) )
207213 } else {
208- kwd ( "const" )
214+ export_prefix
215+ . clone ( )
216+ . append ( kwd ( "const" ) )
209217 . append ( ident ( id) )
210218 . append ( " = " )
211219 . append ( pp_ty ( ty) )
@@ -230,39 +238,87 @@ fn pp_actor<'a>(ty: &'a Type, recs: &'a BTreeSet<&'a str>) -> RcDoc<'a> {
230238 }
231239}
232240
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+
233249pub fn compile ( env : & TypeEnv , actor : & Option < Type > ) -> String {
234250 match actor {
235251 None => {
236252 let def_list: Vec < _ > = env. to_sorted_iter ( ) . map ( |pair| pair. 0 . as_str ( ) ) . collect ( ) ;
237253 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
240264 }
241265 Some ( actor) => {
242266 let def_list = chase_actor ( env, actor) . unwrap ( ) ;
243267 let recs = infer_rec ( env, & def_list) . unwrap ( ) ;
244- let defs = pp_defs ( env, & def_list, & recs) ;
245268 let types = if let TypeInner :: Class ( ref args, _) = actor. as_ref ( ) {
246269 args. iter ( ) . map ( |arg| arg. typ . clone ( ) ) . collect :: < Vec < _ > > ( )
247270 } else {
248271 Vec :: new ( )
249272 } ;
250273 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 ( ) ;
257295 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 ( ";" ) ;
260299 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, "};" ) ) ;
263303 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 ( )
266322 }
267323 }
268324}
0 commit comments