Skip to content

Commit 03feaa3

Browse files
committed
Refactor jet pointer and environment handling in Rust generation
1 parent d190505 commit 03feaa3

File tree

1 file changed

+36
-25
lines changed

1 file changed

+36
-25
lines changed

Haskell-Generate/GenRustJets.hs

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,13 @@ rustJetTargetTy = rustJetTy "target_ty" (\(SomeArrow jet) -> unreflect (snd (rei
189189

190190
rustJetPtr :: Module -> Doc a
191191
rustJetPtr 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
250250
rustJetImpl 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

286296
rustJetEnum :: Module -> Doc a
287297
rustJetEnum mod = vsep
@@ -343,7 +353,7 @@ rustHeader = "/* This file has been automatically generated. */"
343353
rustImports :: Module -> Doc a
344354
rustImports 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

374385
rustFFIImports :: Doc a

0 commit comments

Comments
 (0)