summaryrefslogtreecommitdiff
path: root/src/Parser/Shell.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-09-05 08:47:43 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-09-06 20:23:58 +0200
commita8f93733a9d2df0859d585a11bdd39762f3c37a8 (patch)
treed91e465fd94d7626ad5dd9aad1446264ac26a9c8 /src/Parser/Shell.hs
parenta9439b66ad8f7a8f4ba079a47ecfe1e76c2abc4b (diff)
Expression expansion for shell command
Diffstat (limited to 'src/Parser/Shell.hs')
-rw-r--r--src/Parser/Shell.hs25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs
index a09eb43..8c8ef46 100644
--- a/src/Parser/Shell.hs
+++ b/src/Parser/Shell.hs
@@ -107,12 +107,25 @@ parseArguments = do
parseCommand :: TestParser (Expr ShellCommand)
parseCommand = label "shell statement" $ do
line <- getSourceLine
- command <- parseTextArgument
- args <- parseArguments
- return $ ShellCommand
- <$> command
- <*> args
- <*> pure line
+ choice
+ [ do
+ args <- expressionExpansion "shell command" <* sc
+ args' <- parseArguments
+ return $ commandFromArgLists line <$> args <*> args'
+ , do
+ command <- parseTextArgument
+ args <- parseArguments
+ return $ ShellCommand
+ <$> command
+ <*> args
+ <*> pure line
+ ]
+
+ where
+ commandFromArgLists line (ShellArguments (ShellArgument cmd : args)) (ShellArguments args') =
+ ShellCommand cmd (ShellArguments (args ++ args')) line
+ commandFromArgLists line (ShellArguments args) (ShellArguments args') =
+ ShellCommand "" (ShellArguments (args ++ args')) line
parsePipeline :: Maybe (Expr ShellPipeline) -> TestParser (Expr ShellPipeline)
parsePipeline mbupper = do