Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
7d051f3
Implement Rust type definition codegen
szg251 Nov 16, 2023
9ae86d2
Partial implementation of Rust syntax
szg251 Nov 17, 2023
8bb9976
Implement case_json_constructor for Rust
szg251 Nov 21, 2023
8cf89fc
Implement LamVal json builtins
szg251 Nov 22, 2023
b8c23ce
Update lbr-prelude-derive with proper LamVal builtins
szg251 Nov 22, 2023
fcd419b
Implement curried LamVal builtins
szg251 Nov 22, 2023
e534cac
Rename Rust LamVal builtins module json::curried to json::lamval
szg251 Nov 23, 2023
d468884
More Rust codegen implementation
szg251 Nov 23, 2023
9a1c65f
lbr-prelude-rust: All LamVal builtins should accept a refence
szg251 Nov 27, 2023
b728547
lbr-prelude-derive: adapt to changes made in lbr-prelude for Rust
szg251 Nov 27, 2023
51fbbf3
Implementation of Rust codegen
szg251 Dec 4, 2023
5b64bee
Merge branch 'main' of github.com:mlabs-haskell/lambda-buffers into s…
szg251 Dec 4, 2023
40de8b7
Fix LamVal builtins
szg251 Dec 5, 2023
583e61f
Fix Record instances
szg251 Dec 5, 2023
a337a37
Rust codegen: Phantom Data constructors
szg251 Dec 5, 2023
7e49af8
Rust codegen: Phantom Data deconstructors
szg251 Dec 5, 2023
a265191
Rust codegen: Sum type with PhantomData build and pattern match
szg251 Dec 6, 2023
8ed9230
Rust codegen: add type information to top level LamEs in instance def…
szg251 Dec 6, 2023
ed80e51
Rust codegen: fix trait bound printing
szg251 Dec 6, 2023
08c1906
Rust codegen: Fix PhantomData record constructor
szg251 Dec 6, 2023
1edc537
Remove failed LamVal printer unit test attempts
szg251 Dec 6, 2023
cbfffd6
Remove test files
szg251 Dec 6, 2023
f28a918
Remove incomplete nix derivation for rust
szg251 Dec 6, 2023
975d04d
Rust codegen: suppress Rust warnings
szg251 Dec 7, 2023
3f0e50a
Rust codegen: recursive types support for type definitions
szg251 Dec 8, 2023
03c997d
Rust codegen: recursive type support for data constructors in LamVal
szg251 Dec 8, 2023
a868760
Merge branch 'main' of github.com:mlabs-haskell/lambda-buffers into s…
szg251 Dec 11, 2023
c3b6cdc
Add RedeemerHash
szg251 Dec 15, 2023
59e3157
Rust codegen: refactor Rust ModuleName and Qualified types
szg251 Dec 15, 2023
6f60a48
Rust codegen: collect all Rust foreign references under Refs module
szg251 Dec 15, 2023
3dbd6ab
Rust codegen: update code comments
szg251 Dec 15, 2023
84523e4
Rust codegen: Add explicit exports to refs
szg251 Dec 15, 2023
29aa622
Rust codegen: update config parser a json data
szg251 Dec 15, 2023
7df6711
Merge branch 'main' into szg251/rust-codegen
szg251 Dec 18, 2023
625c1de
Fix auto-merge problems
szg251 Dec 18, 2023
9b4c30e
Fix document typos and mistakes
szg251 Dec 20, 2023
aaf556f
Rust codegen: remove PhantomData type from eq builtins
szg251 Dec 20, 2023
cf7b7cd
Rust codegen: document reference printing
szg251 Dec 20, 2023
c12481e
Rust codegen: fix wrong Plutus version in rust config
szg251 Dec 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenRust.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
module LambdaBuffers.Codegen.Cli.GenRust (GenOpts (..), gen) where

import Control.Lens (makeLenses, (^.))
import Control.Monad (unless)
import Data.Aeson (decodeFileStrict')
import LambdaBuffers.Codegen.Cli.Gen (logError)
import LambdaBuffers.Codegen.Cli.Gen qualified as Gen
import LambdaBuffers.Codegen.Rust (runPrint)
import LambdaBuffers.Codegen.Rust.Config qualified as R
import Paths_lambda_buffers_codegen qualified as Paths
import System.Directory (doesFileExist)
import System.Directory.Internal.Prelude (exitFailure)

data GenOpts = MkGenOpts
{ _config :: [FilePath]
, _common :: Gen.GenOpts
}

makeLenses 'MkGenOpts

gen :: GenOpts -> IO ()
gen opts = do
cfg <- case opts ^. config of
[] -> do
fp <- Paths.getDataFileName "data/rust-prelude-base.json"
readRustConfig fp
fps -> do
cfgs <- traverse readRustConfig fps
return (mconcat cfgs)

Gen.gen
(opts ^. common)
(\ci -> fmap (\(fp, code, deps) -> Gen.Generated fp code deps) . runPrint cfg ci <$> (ci ^. #modules))

readRustConfig :: FilePath -> IO R.Config
readRustConfig f = do
fExists <- doesFileExist f
unless
fExists
( do
logError "" $ "Provided Rust Codegen configuration file doesn't exists: " <> f
exitFailure
)
mayCfg <- decodeFileStrict' f
case mayCfg of
Nothing -> do
logError "" $ "Invalid Rust configuration file " <> f
exitFailure
Just cfg -> return cfg
22 changes: 22 additions & 0 deletions lambda-buffers-codegen/app/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import LambdaBuffers.Codegen.Cli.Gen (GenOpts (GenOpts))
import LambdaBuffers.Codegen.Cli.GenHaskell qualified as Haskell
import LambdaBuffers.Codegen.Cli.GenPlutarch qualified as Plutarch
import LambdaBuffers.Codegen.Cli.GenPurescript qualified as Purescript
import LambdaBuffers.Codegen.Cli.GenRust qualified as Rust
import Options.Applicative (
InfoMod,
Parser,
Expand Down Expand Up @@ -36,6 +37,7 @@ data Command
= GenHaskell Haskell.GenOpts
| GenPurescript Purescript.GenOpts
| GenPlutarch Plutarch.GenOpts
| GenRust Rust.GenOpts

genOptsP :: Parser GenOpts
genOptsP =
Expand Down Expand Up @@ -115,6 +117,19 @@ plutarchGenOptsP =
)
<*> genOptsP

rustGenOptsP :: Parser Rust.GenOpts
rustGenOptsP =
Rust.MkGenOpts
<$> many
( strOption
( long "config"
<> short 'c'
<> metavar "FILEPATH"
<> help "Configuration file for the Rust Codegen module (multiple `config`s are merged with left first merge conflict strategy)"
)
)
<*> genOptsP

mkProgDesc :: forall {a}. String -> InfoMod a
mkProgDesc backend =
progDesc $
Expand Down Expand Up @@ -144,6 +159,12 @@ commandP =
(GenPlutarch <$> (helper *> plutarchGenOptsP))
(mkProgDesc "Plutarch")
)
<> command
"gen-rust"
( info
(GenRust <$> (helper *> rustGenOptsP))
(mkProgDesc "Rust")
)

parserInfo :: ParserInfo Command
parserInfo = info (commandP <**> helper) (fullDesc <> progDesc "LambdaBuffers Codegen command-line interface tool")
Expand All @@ -156,3 +177,4 @@ main = do
GenHaskell opts -> Haskell.gen opts
GenPurescript opts -> Purescript.gen opts
GenPlutarch opts -> Plutarch.gen opts
GenRust opts -> Rust.gen opts
3 changes: 3 additions & 0 deletions lambda-buffers-codegen/build.nix
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ _:
lbg-plutarch = pkgs.writeShellScriptBin "lbg-plutarch" ''
${config.packages.lbg}/bin/lbg gen-plutarch $@
'';
lbg-rust = pkgs.writeShellScriptBin "lbg-rust" ''
${config.packages.lbg}/bin/lbg gen-rust $@
'';

codegen-configs = pkgs.stdenv.mkDerivation {
name = "codegen-configs";
Expand Down
185 changes: 185 additions & 0 deletions lambda-buffers-codegen/data/rust-plutus-pla.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
{
"opaquesConfig": {
"Plutus.V1.PlutusData": [
"plutus-ledger-api",
"plutus_data",
"PlutusData"
],
"Plutus.V1.Address": [
"plutus-ledger-api",
"v1",
"address",
"Address"
],
"Plutus.V1.Credential": [
"plutus-ledger-api",
"v1",
"address",
"Credential"
],
"Plutus.V1.StakingCredential": [
"plutus-ledger-api",
"v1",
"address",
"StakingCredential"
],
"Plutus.V1.PubKeyHash": [
"plutus-ledger-api",
"v1",
"crypto",
"Ed25519PubKeyHash"
],
"Plutus.V1.Bytes": [
"plutus-ledger-api",
"v1",
"crypto",
"LedgerBytes"
],
"Plutus.V1.Interval": [
"plutus-ledger-api",
"v1",
"interval",
"Interval"
],
"Plutus.V1.Extended": [
"plutus-ledger-api",
"v1",
"interval",
"Extended"
],
"Plutus.V1.LowerBound": [
"plutus-ledger-api",
"v1",
"interval",
"LowerBound"
],
"Plutus.V1.UpperBound": [
"plutus-ledger-api",
"v1",
"interval",
"UpperBound"
],
"Plutus.V1.POSIXTime": [
"plutus-ledger-api",
"v1",
"transaction",
"POSIXTime"
],
"Plutus.V1.POSIXTimeRange": [
"plutus-ledger-api",
"v1",
"transaction",
"POSIXTimeRange"
],
"Plutus.V1.Value": [
"plutus-ledger-api",
"v1",
"value",
"Value"
],
"Plutus.V1.CurrencySymbol": [
"plutus-ledger-api",
"v1",
"value",
"CurrencySymbol"
],
"Plutus.V1.AssetClass": [
"plutus-ledger-api",
"v1",
"value",
"AssetClass"
],
"Plutus.V1.TokenName": [
"plutus-ledger-api",
"v1",
"value",
"TokenName"
],
"Plutus.V1.Redeemer": [
"plutus-ledger-api",
"v1",
"redeemer",
"Redeemer"
],
"Plutus.V1.Datum": [
"plutus-ledger-api",
"v1",
"datum",
"Datum"
],
"Plutus.V1.DatumHash": [
"plutus-ledger-api",
"v1",
"datum",
"DatumHash"
],
"Plutus.V1.RedeemerHash": [
"plutus-ledger-api",
"v1",
"redeemer",
"RedeemerHash"
],
"Plutus.V1.ScriptHash": [
"plutus-ledger-api",
"v1",
"script",
"ScriptHash"
],
"Plutus.V1.TxInInfo": [
"plutus-ledger-api",
"v1",
"transaction",
"TxInInfo"
],
"Plutus.V1.TxId": [
"plutus-ledger-api",
"v1",
"transaction",
"TransactionHash"
],
"Plutus.V1.TxOut": [
"plutus-ledger-api",
"v1",
"transaction",
"TransactionOutput"
],
"Plutus.V1.TxOutRef": [
"plutus-ledger-api",
"v1",
"transaction",
"TransactionInput"
],
"Plutus.V1.Map": [
"std",
"collections",
"BTreeMap"
],
"Plutus.V2.TxInInfo": [
"plutus-ledger-api",
"v2",
"transaction",
"TxInInfo"
],
"Plutus.V2.OutputDatum": [
"plutus-ledger-api",
"v2",
"datum",
"OutputDatum"
],
"Plutus.V2.TxOut": [
"plutus-ledger-api",
"v2",
"transaction",
"TransactionOutput"
]
},
"classesConfig": {
"Plutus.V1.PlutusData": [
[
"plutus-ledger-api",
"plutus_data",
"IsPlutusData"
]
]
}
}
72 changes: 72 additions & 0 deletions lambda-buffers-codegen/data/rust-prelude-base.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"opaquesConfig": {
"Prelude.Map": [
"std",
"collections",
"BTreeMap"
],
"Prelude.Set": [
"std",
"collections",
"BTreeSet"
],
"Prelude.List": [
"std",
"vec",
"Vec"
],
"Prelude.Either": [
"std",
"result",
"Result"
],
"Prelude.Maybe": [
"std",
"option",
"Option"
],
"Prelude.Bytes": [
"std",
"vec",
"Vec<u8>"
],
"Prelude.Text": [
"std",
"string",
"String"
],
"Prelude.Char": [
"char"
],
"Prelude.Integer": [
"num_bigint",
"BigInt"
],
"Prelude.Bool": [
"std",
"primitive",
"bool"
]
},
"classesConfig": {
"Prelude.Eq": [
[
"std",
"cmp",
"PartialEq"
],
[
"std",
"cmp",
"Eq"
]
],
"Prelude.Json": [
[
"lbr-prelude",
"json",
"Json"
]
]
}
}
Loading