summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-04-19 22:03:43 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2025-04-21 12:16:36 +0200
commit57671619f81dbdcafa1fce4f91956bc647a57588 (patch)
tree503804091c0da13fd10ac53d42f49060ba913f0b /src
parentbaa086bd025ce49a75d8cc9d64d24615ab960357 (diff)
Asset type and parserHEADmasterdevel
Diffstat (limited to 'src')
-rw-r--r--src/Asset.hs30
-rw-r--r--src/Parser.hs17
2 files changed, 46 insertions, 1 deletions
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
]