From fc40dfc41e8b3fbbe830846499ccce122930b235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Thu, 7 Aug 2025 21:45:20 +0200 Subject: Shell pipes Changelog: Implemented pipes in shell scripts --- src/Parser/Shell.hs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'src/Parser/Shell.hs') 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 -- cgit v1.2.3