@@ -189,13 +189,13 @@ rustJetTargetTy = rustJetTy "target_ty" (\(SomeArrow jet) -> unreflect (snd (rei
189189
190190rustJetPtr :: Module -> Doc a
191191rustJetPtr mod = vsep $
192- [ nest 4 (vsep (" fn c_jet_ptr(&self ) -> &dyn Fn (&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {" :
192+ [ nest 4 (vsep (" fn c_jet_ptr(jet: &Self::Jet ) -> fn (&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {" :
193193 if modname == " Bitcoin"
194194 then [" unimplemented!(\" Bitcoin jets have not yet been implemented.\" )" ]
195- else [ nest 4 (vsep (" match self {" :
195+ else [ nest 4 (vsep (" match jet {" :
196196 map (<> comma)
197197 [ pretty modname <> " ::" <> pretty (jetName jet) <+> " =>" <+>
198- pretty (" & simplicity_sys::c_jets::jets_wrapper::" ++ cJetName jet)
198+ pretty (" simplicity_sys::c_jets::jets_wrapper::" ++ cJetName jet)
199199 | SomeArrow jet <- moduleJets mod
200200 ]))
201201 , " }"
@@ -250,38 +250,48 @@ rustJetImpl :: Module -> Doc a
250250rustJetImpl mod = vsep $
251251 [ nest 4 (vsep $ punctuate line
252252 [" impl Jet for" <+> pretty modname <+> " {"
253- , env
254253 , rustJetCmr mod
255254 , rustJetSourceTy mod
256255 , rustJetTargetTy mod
257256 , rustJetEncode mod
258257 , rustJetDecode mod
259- , rustJetPtr mod
260258 , rustJetCost mod
261259 ])
262260 , " }"
263261 ]
264262 where
265263 modname = rustModuleName mod
266- env = vsep
267- [ pretty $ " type Environment = " ++ env++ " ;"
268- , pretty $ " type CJetEnvironment = " ++ cEnv++ " ;"
269- , " "
270- , pretty $ " fn c_jet_env(" ++ envArg++ " : &Self::Environment) -> &Self::CJetEnvironment {"
271- , pretty $ " " ++ envBody
272- , " }"
273- ]
274- where
275- env | Nothing <- moduleName mod = " ()"
276- | Just " Elements" == moduleName mod = " ElementsEnv<std::sync::Arc<elements::Transaction>>"
277- | Just name <- moduleName mod = name ++ " Env"
278- cEnv | Just " Elements" == moduleName mod = " CElementsTxEnv"
279- | otherwise = " ()"
280- envArg | Just " Bitcoin" == moduleName mod = " _env"
281- | otherwise = " env"
282- envBody | Nothing == moduleName mod = " env"
283- | Just " Bitcoin" == moduleName mod = " unimplemented!(\" Unspecified CJetEnvironment for Bitcoin jets\" )"
284- | otherwise = " env.c_tx_env()"
264+
265+ rustJetEnvImpl :: Module -> Doc a
266+ rustJetEnvImpl mod = vsep $
267+ typeAlias ++
268+ [ nest 4 (vsep $ punctuate line
269+ [" impl JetEnvironment for" <+> pretty envTypeName <+> " {"
270+ , vsep
271+ [ " type Jet =" <+> pretty modname <> semi
272+ , " type CJetEnvironment =" <+> pretty cJetEnvType <> semi
273+ ]
274+ , vsep
275+ [ " fn c_jet_env(&self) -> &Self::CJetEnvironment {"
276+ , " " <> pretty cJetEnvBody
277+ , " }"
278+ ]
279+ , rustJetPtr mod
280+ ])
281+ , " }"
282+ ]
283+ where
284+ modname = rustModuleName mod
285+ envTypeName | Nothing <- moduleName mod = " CoreEnv"
286+ | Just " Elements" == moduleName mod = " ElementsTxEnv"
287+ | Just name <- moduleName mod = name ++ " Env"
288+ typeAlias | Nothing <- moduleName mod = [" pub type CoreEnv = ();" , mempty ]
289+ | Just " Elements" == moduleName mod = [" pub type ElementsTxEnv = ElementsEnv<std::sync::Arc<elements::Transaction>>;" , mempty ]
290+ | otherwise = []
291+ cJetEnvType | Just " Elements" == moduleName mod = " CElementsTxEnv" :: String
292+ | otherwise = " ()"
293+ cJetEnvBody | Just " Elements" == moduleName mod = " self.c_tx_env()" :: String
294+ | otherwise = " &()"
285295
286296rustJetEnum :: Module -> Doc a
287297rustJetEnum mod = vsep
@@ -343,7 +353,7 @@ rustHeader = "/* This file has been automatically generated. */"
343353rustImports :: Module -> Doc a
344354rustImports mod = vsep (map (<> semi)
345355 ([ " use crate::jet::type_name::TypeName"
346- , " use crate::jet::Jet"
356+ , " use crate::jet::{ Jet, JetEnvironment} "
347357 , " use crate::merkle::cmr::Cmr"
348358 , " use crate::decode_bits"
349359 , " use crate::{decode, BitIter, BitWriter}"
@@ -369,6 +379,7 @@ rustJetDoc mod = layoutPretty layoutOptions $ vsep (map (<> line)
369379 , rustJetImpl mod
370380 , rustJetDisplay mod
371381 , rustJetFromStr mod
382+ , rustJetEnvImpl mod
372383 ])
373384
374385rustFFIImports :: Doc a
0 commit comments