Skip to content

Commit 59d3fb6

Browse files
authored
Merge pull request #156 from mlabs-haskell/szg251/rust-codegen
Rust codegen
2 parents cadc930 + c12481e commit 59d3fb6

File tree

31 files changed

+2389
-207
lines changed

31 files changed

+2389
-207
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
module LambdaBuffers.Codegen.Cli.GenRust (GenOpts (..), gen) where
2+
3+
import Control.Lens (makeLenses, (^.))
4+
import Control.Monad (unless)
5+
import Data.Aeson (decodeFileStrict')
6+
import LambdaBuffers.Codegen.Cli.Gen (logError)
7+
import LambdaBuffers.Codegen.Cli.Gen qualified as Gen
8+
import LambdaBuffers.Codegen.Rust (runPrint)
9+
import LambdaBuffers.Codegen.Rust.Config qualified as R
10+
import Paths_lambda_buffers_codegen qualified as Paths
11+
import System.Directory (doesFileExist)
12+
import System.Directory.Internal.Prelude (exitFailure)
13+
14+
data GenOpts = MkGenOpts
15+
{ _config :: [FilePath]
16+
, _common :: Gen.GenOpts
17+
}
18+
19+
makeLenses 'MkGenOpts
20+
21+
gen :: GenOpts -> IO ()
22+
gen opts = do
23+
cfg <- case opts ^. config of
24+
[] -> do
25+
fp <- Paths.getDataFileName "data/rust-prelude-base.json"
26+
readRustConfig fp
27+
fps -> do
28+
cfgs <- traverse readRustConfig fps
29+
return (mconcat cfgs)
30+
31+
Gen.gen
32+
(opts ^. common)
33+
(\ci -> fmap (\(fp, code, deps) -> Gen.Generated fp code deps) . runPrint cfg ci <$> (ci ^. #modules))
34+
35+
readRustConfig :: FilePath -> IO R.Config
36+
readRustConfig f = do
37+
fExists <- doesFileExist f
38+
unless
39+
fExists
40+
( do
41+
logError "" $ "Provided Rust Codegen configuration file doesn't exists: " <> f
42+
exitFailure
43+
)
44+
mayCfg <- decodeFileStrict' f
45+
case mayCfg of
46+
Nothing -> do
47+
logError "" $ "Invalid Rust configuration file " <> f
48+
exitFailure
49+
Just cfg -> return cfg

lambda-buffers-codegen/app/Main.hs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import LambdaBuffers.Codegen.Cli.Gen (GenOpts (GenOpts))
66
import LambdaBuffers.Codegen.Cli.GenHaskell qualified as Haskell
77
import LambdaBuffers.Codegen.Cli.GenPlutarch qualified as Plutarch
88
import LambdaBuffers.Codegen.Cli.GenPurescript qualified as Purescript
9+
import LambdaBuffers.Codegen.Cli.GenRust qualified as Rust
910
import Options.Applicative (
1011
InfoMod,
1112
Parser,
@@ -36,6 +37,7 @@ data Command
3637
= GenHaskell Haskell.GenOpts
3738
| GenPurescript Purescript.GenOpts
3839
| GenPlutarch Plutarch.GenOpts
40+
| GenRust Rust.GenOpts
3941

4042
genOptsP :: Parser GenOpts
4143
genOptsP =
@@ -115,6 +117,19 @@ plutarchGenOptsP =
115117
)
116118
<*> genOptsP
117119

120+
rustGenOptsP :: Parser Rust.GenOpts
121+
rustGenOptsP =
122+
Rust.MkGenOpts
123+
<$> many
124+
( strOption
125+
( long "config"
126+
<> short 'c'
127+
<> metavar "FILEPATH"
128+
<> help "Configuration file for the Rust Codegen module (multiple `config`s are merged with left first merge conflict strategy)"
129+
)
130+
)
131+
<*> genOptsP
132+
118133
mkProgDesc :: forall {a}. String -> InfoMod a
119134
mkProgDesc backend =
120135
progDesc $
@@ -144,6 +159,12 @@ commandP =
144159
(GenPlutarch <$> (helper *> plutarchGenOptsP))
145160
(mkProgDesc "Plutarch")
146161
)
162+
<> command
163+
"gen-rust"
164+
( info
165+
(GenRust <$> (helper *> rustGenOptsP))
166+
(mkProgDesc "Rust")
167+
)
147168

148169
parserInfo :: ParserInfo Command
149170
parserInfo = info (commandP <**> helper) (fullDesc <> progDesc "LambdaBuffers Codegen command-line interface tool")
@@ -156,3 +177,4 @@ main = do
156177
GenHaskell opts -> Haskell.gen opts
157178
GenPurescript opts -> Purescript.gen opts
158179
GenPlutarch opts -> Plutarch.gen opts
180+
GenRust opts -> Rust.gen opts

lambda-buffers-codegen/build.nix

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ _:
4545
lbg-plutarch = pkgs.writeShellScriptBin "lbg-plutarch" ''
4646
${config.packages.lbg}/bin/lbg gen-plutarch $@
4747
'';
48+
lbg-rust = pkgs.writeShellScriptBin "lbg-rust" ''
49+
${config.packages.lbg}/bin/lbg gen-rust $@
50+
'';
4851

4952
codegen-configs = pkgs.stdenv.mkDerivation {
5053
name = "codegen-configs";
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
{
2+
"opaquesConfig": {
3+
"Plutus.V1.PlutusData": [
4+
"plutus-ledger-api",
5+
"plutus_data",
6+
"PlutusData"
7+
],
8+
"Plutus.V1.Address": [
9+
"plutus-ledger-api",
10+
"v1",
11+
"address",
12+
"Address"
13+
],
14+
"Plutus.V1.Credential": [
15+
"plutus-ledger-api",
16+
"v1",
17+
"address",
18+
"Credential"
19+
],
20+
"Plutus.V1.StakingCredential": [
21+
"plutus-ledger-api",
22+
"v1",
23+
"address",
24+
"StakingCredential"
25+
],
26+
"Plutus.V1.PubKeyHash": [
27+
"plutus-ledger-api",
28+
"v1",
29+
"crypto",
30+
"Ed25519PubKeyHash"
31+
],
32+
"Plutus.V1.Bytes": [
33+
"plutus-ledger-api",
34+
"v1",
35+
"crypto",
36+
"LedgerBytes"
37+
],
38+
"Plutus.V1.Interval": [
39+
"plutus-ledger-api",
40+
"v1",
41+
"interval",
42+
"Interval"
43+
],
44+
"Plutus.V1.Extended": [
45+
"plutus-ledger-api",
46+
"v1",
47+
"interval",
48+
"Extended"
49+
],
50+
"Plutus.V1.LowerBound": [
51+
"plutus-ledger-api",
52+
"v1",
53+
"interval",
54+
"LowerBound"
55+
],
56+
"Plutus.V1.UpperBound": [
57+
"plutus-ledger-api",
58+
"v1",
59+
"interval",
60+
"UpperBound"
61+
],
62+
"Plutus.V1.POSIXTime": [
63+
"plutus-ledger-api",
64+
"v1",
65+
"transaction",
66+
"POSIXTime"
67+
],
68+
"Plutus.V1.POSIXTimeRange": [
69+
"plutus-ledger-api",
70+
"v1",
71+
"transaction",
72+
"POSIXTimeRange"
73+
],
74+
"Plutus.V1.Value": [
75+
"plutus-ledger-api",
76+
"v1",
77+
"value",
78+
"Value"
79+
],
80+
"Plutus.V1.CurrencySymbol": [
81+
"plutus-ledger-api",
82+
"v1",
83+
"value",
84+
"CurrencySymbol"
85+
],
86+
"Plutus.V1.AssetClass": [
87+
"plutus-ledger-api",
88+
"v1",
89+
"value",
90+
"AssetClass"
91+
],
92+
"Plutus.V1.TokenName": [
93+
"plutus-ledger-api",
94+
"v1",
95+
"value",
96+
"TokenName"
97+
],
98+
"Plutus.V1.Redeemer": [
99+
"plutus-ledger-api",
100+
"v1",
101+
"redeemer",
102+
"Redeemer"
103+
],
104+
"Plutus.V1.Datum": [
105+
"plutus-ledger-api",
106+
"v1",
107+
"datum",
108+
"Datum"
109+
],
110+
"Plutus.V1.DatumHash": [
111+
"plutus-ledger-api",
112+
"v1",
113+
"datum",
114+
"DatumHash"
115+
],
116+
"Plutus.V1.RedeemerHash": [
117+
"plutus-ledger-api",
118+
"v1",
119+
"redeemer",
120+
"RedeemerHash"
121+
],
122+
"Plutus.V1.ScriptHash": [
123+
"plutus-ledger-api",
124+
"v1",
125+
"script",
126+
"ScriptHash"
127+
],
128+
"Plutus.V1.TxInInfo": [
129+
"plutus-ledger-api",
130+
"v1",
131+
"transaction",
132+
"TxInInfo"
133+
],
134+
"Plutus.V1.TxId": [
135+
"plutus-ledger-api",
136+
"v1",
137+
"transaction",
138+
"TransactionHash"
139+
],
140+
"Plutus.V1.TxOut": [
141+
"plutus-ledger-api",
142+
"v1",
143+
"transaction",
144+
"TransactionOutput"
145+
],
146+
"Plutus.V1.TxOutRef": [
147+
"plutus-ledger-api",
148+
"v1",
149+
"transaction",
150+
"TransactionInput"
151+
],
152+
"Plutus.V1.Map": [
153+
"std",
154+
"collections",
155+
"BTreeMap"
156+
],
157+
"Plutus.V2.TxInInfo": [
158+
"plutus-ledger-api",
159+
"v2",
160+
"transaction",
161+
"TxInInfo"
162+
],
163+
"Plutus.V2.OutputDatum": [
164+
"plutus-ledger-api",
165+
"v2",
166+
"datum",
167+
"OutputDatum"
168+
],
169+
"Plutus.V2.TxOut": [
170+
"plutus-ledger-api",
171+
"v2",
172+
"transaction",
173+
"TransactionOutput"
174+
]
175+
},
176+
"classesConfig": {
177+
"Plutus.V1.PlutusData": [
178+
[
179+
"plutus-ledger-api",
180+
"plutus_data",
181+
"IsPlutusData"
182+
]
183+
]
184+
}
185+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{
2+
"opaquesConfig": {
3+
"Prelude.Map": [
4+
"std",
5+
"collections",
6+
"BTreeMap"
7+
],
8+
"Prelude.Set": [
9+
"std",
10+
"collections",
11+
"BTreeSet"
12+
],
13+
"Prelude.List": [
14+
"std",
15+
"vec",
16+
"Vec"
17+
],
18+
"Prelude.Either": [
19+
"std",
20+
"result",
21+
"Result"
22+
],
23+
"Prelude.Maybe": [
24+
"std",
25+
"option",
26+
"Option"
27+
],
28+
"Prelude.Bytes": [
29+
"std",
30+
"vec",
31+
"Vec<u8>"
32+
],
33+
"Prelude.Text": [
34+
"std",
35+
"string",
36+
"String"
37+
],
38+
"Prelude.Char": [
39+
"char"
40+
],
41+
"Prelude.Integer": [
42+
"num_bigint",
43+
"BigInt"
44+
],
45+
"Prelude.Bool": [
46+
"std",
47+
"primitive",
48+
"bool"
49+
]
50+
},
51+
"classesConfig": {
52+
"Prelude.Eq": [
53+
[
54+
"std",
55+
"cmp",
56+
"PartialEq"
57+
],
58+
[
59+
"std",
60+
"cmp",
61+
"Eq"
62+
]
63+
],
64+
"Prelude.Json": [
65+
[
66+
"lbr-prelude",
67+
"json",
68+
"Json"
69+
]
70+
]
71+
}
72+
}

0 commit comments

Comments
 (0)