From 57671619f81dbdcafa1fce4f91956bc647a57588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sat, 19 Apr 2025 22:03:43 +0200 Subject: Asset type and parser --- erebos-tester.cabal | 1 + src/Asset.hs | 30 ++++++++++++++++++++++++++++++ src/Parser.hs | 17 ++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/Asset.hs diff --git a/erebos-tester.cabal b/erebos-tester.cabal index 7f25169..9d4e5ae 100644 --- a/erebos-tester.cabal +++ b/erebos-tester.cabal @@ -47,6 +47,7 @@ executable erebos-tester Main.hs other-modules: + Asset Config GDB Network diff --git a/src/Asset.hs b/src/Asset.hs new file mode 100644 index 0000000..550438b --- /dev/null +++ b/src/Asset.hs @@ -0,0 +1,30 @@ +module Asset ( + Asset(..), + AssetPath(..), +) where + +import Data.Text (Text) +import Data.Text qualified as T + +import Script.Expr.Class + +data Asset = Asset + { assetPath :: AssetPath + } + +newtype AssetPath = AssetPath FilePath + +textAssetPath :: AssetPath -> Text +textAssetPath (AssetPath path) = T.pack path + +instance ExprType Asset where + textExprType _ = "asset" + textExprValue asset = "asset:" <> textAssetPath (assetPath asset) + + recordMembers = + [ ( "path", RecordSelector $ assetPath ) + ] + +instance ExprType AssetPath where + textExprType _ = "filepath" + textExprValue = ("filepath:" <>) . textAssetPath diff --git a/src/Parser.hs b/src/Parser.hs index 4bb32a7..4afca09 100644 --- a/src/Parser.hs +++ b/src/Parser.hs @@ -26,6 +26,7 @@ import System.Exit import System.FilePath import System.IO.Error +import Asset import Network import Parser.Core import Parser.Expr @@ -98,12 +99,25 @@ parseDefinition = label "symbol definition" $ do replaceArgs (SomeExpr e) = SomeExpr (go unif e) e -> e +parseAsset :: TestParser ( VarName, SomeExpr ) +parseAsset = label "asset definition" $ do + wsymbol "asset" + name <- varName + osymbol ":" + void eol + ref <- L.indentGuard scn GT pos1 + wsymbol "path" + osymbol ":" + assetPath <- AssetPath . TL.unpack <$> takeWhile1P Nothing (/= '\n') + void $ L.indentGuard scn LT ref + return ( name, SomeExpr $ Pure Asset {..} ) + parseExport :: TestParser [ Toplevel ] parseExport = label "export declaration" $ toplevel id $ do wsymbol "export" choice [ do - def@( name, _ ) <- parseDefinition + def@( name, _ ) <- parseDefinition <|> parseAsset return [ ToplevelDefinition def, ToplevelExport name ] , do names <- listOf varName @@ -139,6 +153,7 @@ parseTestModule absPath = do toplevels <- fmap concat $ many $ choice [ (: []) <$> parseTestDefinition , (: []) <$> toplevel ToplevelDefinition parseDefinition + , (: []) <$> toplevel ToplevelDefinition parseAsset , parseExport , parseImport ] -- cgit v1.2.3