Skip to content

Commit adc70bc

Browse files
committed
Merge branch 'szg251/rust-codegen' of github.com:mlabs-haskell/lambda-buffers into szg251/rust-nix
2 parents 7ccaa1c + 3dbd6ab commit adc70bc

File tree

8 files changed

+205
-152
lines changed

8 files changed

+205
-152
lines changed

lambda-buffers-codegen/data/rust-plutus-pla.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@
9797
],
9898
"Plutus.V1.RedeemerHash": [
9999
"plutus-ledger-api",
100-
"v1::crypto",
101-
"LedgerBytes"
100+
"v1::redeemer",
101+
"RedeemerHash"
102102
],
103103
"Plutus.V1.ScriptHash": [
104104
"plutus-ledger-api",

lambda-buffers-codegen/lambda-buffers-codegen.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ library
152152
LambdaBuffers.Codegen.Rust.Print.InstanceDef
153153
LambdaBuffers.Codegen.Rust.Print.LamVal
154154
LambdaBuffers.Codegen.Rust.Print.MonadPrint
155+
LambdaBuffers.Codegen.Rust.Print.Refs
155156
LambdaBuffers.Codegen.Rust.Print.Syntax
156157
LambdaBuffers.Codegen.Rust.Print.TyDef
157158

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Rust/Print/Derive.hs

Lines changed: 61 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import LambdaBuffers.Codegen.LamVal.PlutusData (deriveFromPlutusDataImpl, derive
1313
import LambdaBuffers.Codegen.Print qualified as Print
1414
import LambdaBuffers.Codegen.Rust.Print (MonadPrint)
1515
import LambdaBuffers.Codegen.Rust.Print.LamVal (printInstance)
16+
import LambdaBuffers.Codegen.Rust.Print.Refs qualified as RR
1617
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as R
1718
import LambdaBuffers.ProtoCompat qualified as PC
1819
import Prettyprinter (Doc, align, braces, colon, comma, encloseSep, hcat, indent, lparen, parens, rparen, space, vsep, (<+>))
@@ -32,22 +33,10 @@ rsTraitImplPrinters ::
3233
)
3334
rsTraitImplPrinters =
3435
Map.fromList
35-
[
36-
( R.qLibRef R.MkTraitName "std" "cmp" "PartialEq"
37-
, printDerivePartialEqBase
38-
)
39-
,
40-
( R.qLibRef R.MkTraitName "std" "cmp" "Eq"
41-
, printDeriveEqBase
42-
)
43-
,
44-
( R.qLibRef R.MkTraitName "plutus-ledger-api" "plutus_data" "IsPlutusData"
45-
, printDeriveIsPlutusData
46-
)
47-
,
48-
( R.qLibRef R.MkTraitName "lbr-prelude" "json" "Json"
49-
, printDeriveJson
50-
)
36+
[ (RR.partialEqTrait, printDerivePartialEqBase)
37+
, (RR.eqTrait, printDeriveEqBase)
38+
, (RR.isPlutusDataTrait, printDeriveIsPlutusData)
39+
, (RR.jsonTrait, printDeriveJson)
5140
]
5241
eqTraitMethodName :: R.ValueName
5342
eqTraitMethodName = R.MkValueName "eq"
@@ -60,13 +49,13 @@ eqTraitMethodReturns = R.qBuiltin R.MkTyName "bool"
6049

6150
lvEqBuiltinsBase :: LV.PrintRead R.QValName
6251
lvEqBuiltinsBase = LV.MkPrintRead $ \(_ty, refName) ->
63-
Map.lookup refName $
64-
Map.fromList
65-
[ ("eq", R.qLibRef R.MkValueName "lbr-prelude" "lamval" "eq")
66-
, ("and", R.qLibRef R.MkValueName "lbr-prelude" "lamval" "and")
52+
Map.lookup refName
53+
$ Map.fromList
54+
[ ("eq", R.qForeignRef R.MkValueName "lbr-prelude" ["lamval"] "eq")
55+
, ("and", R.qForeignRef R.MkValueName "lbr-prelude" ["lamval"] "and")
6756
, ("true", R.qBuiltin R.MkValueName "true")
6857
, ("false", R.qBuiltin R.MkValueName "false")
69-
, ("PhantomData", R.qLibRef R.MkValueName "std" "marker" "PhantomData")
58+
, ("PhantomData", R.qForeignRef R.MkValueName "std" ["marker"] "PhantomData")
7059
]
7160

7261
printDerivePartialEqBase :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
@@ -78,26 +67,26 @@ printDerivePartialEqBase mn pkgs iTyDefs mkInstance ty = do
7867
Left err -> Print.throwInternalError' (mn ^. #sourceInfo) ("Interpreting LamVal into Rust failed with: " <> err ^. P.msg)
7968
Right (implDoc, imps) -> do
8069
for_ imps Print.importValue
81-
return $
82-
mkInstance $
83-
printTraitMethod eqTraitMethodName eqTraitMethodArgs eqTraitMethodReturns implDoc
70+
return
71+
$ mkInstance
72+
$ printTraitMethod eqTraitMethodName eqTraitMethodArgs eqTraitMethodReturns implDoc
8473

8574
printDeriveEqBase :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
8675
printDeriveEqBase _ _ _ mkInstance _ = return $ mkInstance mempty
8776

8877
lvPlutusDataBuiltins :: LV.PrintRead R.QValName
8978
lvPlutusDataBuiltins = LV.MkPrintRead $ \(_ty, refName) ->
90-
Map.lookup refName $
91-
Map.fromList
92-
[ ("toPlutusData", R.qLibRef R.MkValueName "plutus-ledger-api" "plutus_data::IsPlutusData" "to_plutus_data")
93-
, ("fromPlutusData", R.qLibRef R.MkValueName "plutus-ledger-api" "plutus_data::IsPlutusData" "from_plutus_data")
94-
, ("casePlutusData", R.qLibRef R.MkValueName "plutus-ledger-api" "lamval" "case_plutus_data")
95-
, ("integerData", R.qLibRef R.MkValueName "plutus-ledger-api" "plutus_data" "PlutusData::integer")
96-
, ("constrData", R.qLibRef R.MkValueName "plutus-ledger-api" "lamval" "constr")
97-
, ("listData", R.qLibRef R.MkValueName "plutus-ledger-api" "plutus_data" "PlutusData::list")
98-
, ("succeedParse", R.qLibRef R.MkValueName "std" "result" "Result::Ok")
99-
, ("failParse", R.qLibRef R.MkValueName "plutus-ledger-api" "lamval" "fail_parse()")
100-
, ("bindParse", R.qLibRef R.MkValueName "plutus-ledger-api" "lamval" "bind_parse")
79+
Map.lookup refName
80+
$ Map.fromList
81+
[ ("toPlutusData", R.qForeignRef R.MkValueName "plutus-ledger-api" ["plutus_data", "IsPlutusData"] "to_plutus_data")
82+
, ("fromPlutusData", R.qForeignRef R.MkValueName "plutus-ledger-api" ["plutus_data", "IsPlutusData"] "from_plutus_data")
83+
, ("casePlutusData", R.qForeignRef R.MkValueName "plutus-ledger-api" ["lamval"] "case_plutus_data")
84+
, ("integerData", R.qForeignRef R.MkValueName "plutus-ledger-api" ["plutus_data"] "PlutusData::integer")
85+
, ("constrData", R.qForeignRef R.MkValueName "plutus-ledger-api" ["lamval"] "constr")
86+
, ("listData", R.qForeignRef R.MkValueName "plutus-ledger-api" ["plutus_data"] "PlutusData::list")
87+
, ("succeedParse", R.qForeignRef R.MkValueName "std" ["result", "Result"] "Ok")
88+
, ("failParse", R.qForeignRef R.MkValueName "plutus-ledger-api" ["lamval"] "fail_parse()")
89+
, ("bindParse", R.qForeignRef R.MkValueName "plutus-ledger-api" ["lamval"] "bind_parse")
10190
]
10291

10392
toPlutusDataTraitMethodName :: R.ValueName
@@ -108,7 +97,7 @@ toPlutusDataTraitMethodArgs = [(R.MkValueName "self", R.qBuiltin R.MkTyName "Sel
10897

10998
toPlutusDataTraitMethodReturns :: R.QTyName
11099
toPlutusDataTraitMethodReturns =
111-
R.qLibRef R.MkTyName "plutus-ledger-api" "plutus_data" "PlutusData"
100+
R.qForeignRef R.MkTyName "plutus-ledger-api" ["plutus_data"] "PlutusData"
112101

113102
fromPlutusDataTraitMethodName :: R.ValueName
114103
fromPlutusDataTraitMethodName = R.MkValueName "from_plutus_data"
@@ -117,20 +106,20 @@ fromPlutusDataTraitMethodArgs :: [(R.ValueName, R.QTyName)]
117106
fromPlutusDataTraitMethodArgs =
118107
[
119108
( R.MkValueName "plutus_data"
120-
, R.qLibRef
109+
, R.qForeignRef
121110
R.MkTyName
122111
"plutus-ledger-api"
123-
"plutus_data"
112+
["plutus_data"]
124113
"PlutusData"
125114
)
126115
]
127116

128117
fromPlutusDataTraitMethodReturns :: R.QTyName
129118
fromPlutusDataTraitMethodReturns =
130-
R.qLibRef
119+
R.qForeignRef
131120
R.MkTyName
132121
"std"
133-
"result"
122+
["result"]
134123
"Result<Self, plutus_ledger_api::plutus_data::PlutusDataError>"
135124

136125
printDeriveIsPlutusData :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
@@ -143,16 +132,16 @@ printDeriveIsPlutusData mn pkgs iTyDefs mkInstanceDoc ty = do
143132

144133
printDeriveIsPlutusData' :: PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> Either P.InternalError (Doc ann, Set R.QValName)
145134
printDeriveIsPlutusData' mn pkgs iTyDefs mkInstanceDoc ty = do
146-
let extraDeps = Set.singleton (R.qLibRef R.MkValueName "serde_json" "" "Value")
135+
let extraDeps = Set.singleton (R.qForeignRef R.MkValueName "serde_json" [] "Value")
147136
toPlutusDataValE <- deriveToPlutusDataImpl mn iTyDefs ty
148137
(toPlutusDataImplDoc, impsA) <- LV.runPrint lvPlutusDataBuiltins (printInstance pkgs [R.qBuiltin R.MkTyName "Self"] iTyDefs toPlutusDataValE)
149138
fromPlutusDataValE <- deriveFromPlutusDataImpl mn iTyDefs ty
150-
(fromPlutusDataImplDoc, impsB) <- LV.runPrint lvPlutusDataBuiltins (printInstance pkgs [R.qLibRef R.MkTyName "plutus-ledger-api" "plutus_data" "PlutusData"] iTyDefs fromPlutusDataValE)
139+
(fromPlutusDataImplDoc, impsB) <- LV.runPrint lvPlutusDataBuiltins (printInstance pkgs [R.qForeignRef R.MkTyName "plutus-ledger-api" ["plutus_data"] "PlutusData"] iTyDefs fromPlutusDataValE)
151140

152141
let instanceDoc =
153142
mkInstanceDoc
154-
( align $
155-
vsep
143+
( align
144+
$ vsep
156145
[ printTraitMethod
157146
toPlutusDataTraitMethodName
158147
toPlutusDataTraitMethodArgs
@@ -173,20 +162,20 @@ printDeriveIsPlutusData' mn pkgs iTyDefs mkInstanceDoc ty = do
173162
-- | LambdaBuffers.Codegen.LamVal.Json specification printing
174163
lvJsonBuiltins :: LV.PrintRead R.QValName
175164
lvJsonBuiltins = LV.MkPrintRead $ \(_ty, refName) ->
176-
Map.lookup refName $
177-
Map.fromList
178-
[ ("toJson", R.qLibRef R.MkValueName "lbr-prelude" "json::Json" "to_json")
179-
, ("fromJson", R.qLibRef R.MkValueName "lbr-prelude" "json::Json" "from_json")
180-
, ("jsonObject", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "json_object")
181-
, ("jsonConstructor", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "json_constructor")
182-
, ("jsonArray", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "json_array")
183-
, ("caseJsonConstructor", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "case_json_constructor")
184-
, ("caseJsonArray", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "case_json_array")
185-
, ("caseJsonObject", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "case_json_object")
186-
, ("jsonField", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "json_field")
187-
, ("succeedParse", R.qLibRef R.MkValueName "std" "result" "Result::Ok")
188-
, ("failParse", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "fail_parse")
189-
, ("bindParse", R.qLibRef R.MkValueName "lbr-prelude" "json::lamval" "bind_parse")
165+
Map.lookup refName
166+
$ Map.fromList
167+
[ ("toJson", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "Json"] "to_json")
168+
, ("fromJson", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "Json"] "from_json")
169+
, ("jsonObject", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "json_object")
170+
, ("jsonConstructor", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "json_constructor")
171+
, ("jsonArray", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "json_array")
172+
, ("caseJsonConstructor", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "case_json_constructor")
173+
, ("caseJsonArray", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "case_json_array")
174+
, ("caseJsonObject", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "case_json_object")
175+
, ("jsonField", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "json_field")
176+
, ("succeedParse", R.qForeignRef R.MkValueName "std" ["result", "Result"] "Ok")
177+
, ("failParse", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "fail_parse")
178+
, ("bindParse", R.qForeignRef R.MkValueName "lbr-prelude" ["json", "lamval"] "bind_parse")
190179
]
191180

192181
toJsonTraitMethodName :: R.ValueName
@@ -197,17 +186,17 @@ toJsonTraitMethodArgs = [(R.MkValueName "self", R.qBuiltin R.MkTyName "Self")]
197186

198187
toJsonTraitMethodReturns :: R.QTyName
199188
toJsonTraitMethodReturns =
200-
R.qLibRef R.MkTyName "serde_json" "" "Value"
189+
R.qForeignRef R.MkTyName "serde_json" [] "Value"
201190

202191
fromJsonTraitMethodName :: R.ValueName
203192
fromJsonTraitMethodName = R.MkValueName "from_json"
204193

205194
fromJsonTraitMethodArgs :: [(R.ValueName, R.QTyName)]
206-
fromJsonTraitMethodArgs = [(R.MkValueName "value", R.qLibRef R.MkTyName "serde_json" "" "Value")]
195+
fromJsonTraitMethodArgs = [(R.MkValueName "value", R.qForeignRef R.MkTyName "serde_json" [] "Value")]
207196

208197
fromJsonTraitMethodReturns :: R.QTyName
209198
fromJsonTraitMethodReturns =
210-
R.qLibRef R.MkTyName "std" "result" "Result<Self, lbr_prelude::error::Error>" -- TODO(szg251): This is a hack
199+
R.qForeignRef R.MkTyName "std" ["result"] "Result<Self, lbr_prelude::error::Error>" -- TODO(szg251): This is a hack
211200

212201
printDeriveJson :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
213202
printDeriveJson mn pkgs iTyDefs mkInstanceDoc ty = do
@@ -226,8 +215,8 @@ printDeriveJson' mn pkgs iTyDefs mkInstanceDoc ty = do
226215

227216
let instanceDoc =
228217
mkInstanceDoc
229-
( align $
230-
vsep
218+
( align
219+
$ vsep
231220
[ printTraitMethod
232221
toJsonTraitMethodName
233222
toJsonTraitMethodArgs
@@ -242,7 +231,7 @@ printDeriveJson' mn pkgs iTyDefs mkInstanceDoc ty = do
242231
)
243232
return
244233
( instanceDoc
245-
, impsA <> impsB <> Set.singleton (R.qLibRef R.MkValueName "serde_json" "" "Value")
234+
, impsA <> impsB <> Set.singleton (R.qForeignRef R.MkValueName "serde_json" [] "Value")
246235
)
247236

248237
{- | Print a trait method implementation
@@ -261,11 +250,11 @@ printTraitMethod fnName args returns implDoc =
261250
let argsWithTypes =
262251
encloseSep lparen rparen comma $ (\(arg, ty) -> R.printRsValName arg <> colon <+> "&'a " <> R.printRsQTyName ty) <$> args
263252
argsLst = hcat $ parens . R.printRsValName . fst <$> args
264-
in indent 4 $
265-
"fn"
266-
<+> R.printRsValName fnName
267-
<> "<'a>"
268-
<> argsWithTypes
269-
<+> "->"
270-
<+> R.printRsQTyName returns
271-
<+> braces (space <> implDoc <> argsLst)
253+
in indent 4
254+
$ "fn"
255+
<+> R.printRsValName fnName
256+
<> "<'a>"
257+
<> argsWithTypes
258+
<+> "->"
259+
<+> R.printRsQTyName returns
260+
<+> braces (space <> implDoc <> argsLst)

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Rust/Print/InstanceDef.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Control.Lens (view)
44
import Data.Foldable (Foldable (toList))
55
import Data.Set (Set)
66
import Data.Set qualified as Set
7+
import LambdaBuffers.Codegen.Rust.Print.Refs qualified as RR
78
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as R
89
import LambdaBuffers.Codegen.Rust.Print.TyDef (printTyInner)
910
import LambdaBuffers.ProtoCompat qualified as PC
@@ -36,7 +37,7 @@ printInstanceContext :: R.PkgMap -> R.QTraitName -> [PC.Ty] -> Doc ann
3637
printInstanceContext pkgs rsQTraitName = printInstanceContext' pkgs [rsQTraitName]
3738

3839
defaultTraitBounds :: [R.QTraitName]
39-
defaultTraitBounds = [R.qLibRef R.MkTraitName "std" "clone" "Clone"]
40+
defaultTraitBounds = [RR.cloneTrait]
4041

4142
printInstanceContext' :: R.PkgMap -> [R.QTraitName] -> [PC.Ty] -> Doc ann
4243
printInstanceContext' pkgs rsQTraitNames tys =

0 commit comments

Comments
 (0)