summaryrefslogtreecommitdiff
path: root/src/Parser
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-08-07 21:45:20 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2025-08-25 22:55:25 +0200
commitfc40dfc41e8b3fbbe830846499ccce122930b235 (patch)
tree651e96119b5f0a1ba66afc200a465d5009124a3b /src/Parser
parentc07525ac4692a2ee9c76bd0bd53c195c8164480f (diff)
Shell pipesHEADmaster
Changelog: Implemented pipes in shell scripts
Diffstat (limited to 'src/Parser')
-rw-r--r--src/Parser/Shell.hs26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs
index 7720ee9..22d47ed 100644
--- a/src/Parser/Shell.hs
+++ b/src/Parser/Shell.hs
@@ -74,17 +74,35 @@ parseArgument = lexeme $ fmap (App AnnNone (Pure T.concat) <$> foldr (liftA2 (:)
parseArguments :: TestParser (Expr [ Text ])
parseArguments = foldr (liftA2 (:)) (Pure []) <$> many parseArgument
-shellStatement :: TestParser (Expr [ ShellStatement ])
-shellStatement = label "shell statement" $ do
+parseCommand :: TestParser (Expr ShellCommand)
+parseCommand = label "shell statement" $ do
line <- getSourceLine
command <- parseArgument
args <- parseArguments
- return $ fmap (: []) $ ShellStatement
+ return $ ShellCommand
<$> command
<*> args
<*> pure line
+parsePipeline :: Expr (Maybe ShellPipeline) -> TestParser (Expr ShellPipeline)
+parsePipeline upper = do
+ cmd <- parseCommand
+ let pipeline = ShellPipeline <$> cmd <*> upper
+ choice
+ [ do
+ osymbol "|"
+ parsePipeline (Just <$> pipeline)
+
+ , do
+ return pipeline
+ ]
+
+parseStatement :: TestParser (Expr [ ShellStatement ])
+parseStatement = do
+ line <- getSourceLine
+ fmap ((: []) . flip ShellStatement line) <$> parsePipeline (pure Nothing)
+
shellScript :: TestParser (Expr ShellScript)
shellScript = do
indent <- L.indentLevel
- fmap ShellScript <$> blockOf indent shellStatement
+ fmap ShellScript <$> blockOf indent parseStatement