diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Parser/Expr.hs | 1 | ||||
| -rw-r--r-- | src/Parser/Shell.hs | 8 | ||||
| -rw-r--r-- | src/Script/Shell.hs | 18 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/Parser/Expr.hs b/src/Parser/Expr.hs index 89fa208..2d0b770 100644 --- a/src/Parser/Expr.hs +++ b/src/Parser/Expr.hs @@ -14,6 +14,7 @@ module Parser.Expr ( variable, constructor, + expressionExpansion, stringExpansion, functionArguments, diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs index 45f00b9..a09eb43 100644 --- a/src/Parser/Shell.hs +++ b/src/Parser/Shell.hs @@ -92,11 +92,17 @@ parseRedirection = choice parseArgument :: TestParser (Expr ShellArgument) parseArgument = choice [ parseRedirection + , expressionExpansion "shell argument" <* sc , fmap ShellArgument <$> parseTextArgument ] parseArguments :: TestParser (Expr ShellArguments) -parseArguments = (ShellArguments <$>) . foldr (liftA2 (:)) (Pure []) <$> many parseArgument +parseArguments = do + arglists <- many $ choice + [ expressionExpansion "shell arguments" <* sc + , fmap (ShellArguments . (: [])) <$> parseArgument + ] + return $ fmap mconcat $ foldr (liftA2 (:)) (Pure []) $ arglists parseCommand :: TestParser (Expr ShellCommand) parseCommand = label "shell statement" $ do diff --git a/src/Script/Shell.hs b/src/Script/Shell.hs index 3e98e66..e7c8542 100644 --- a/src/Script/Shell.hs +++ b/src/Script/Shell.hs @@ -15,8 +15,10 @@ import Control.Monad.IO.Class import Control.Monad.Reader import Data.Maybe +import Data.Scientific import Data.Text (Text) import Data.Text qualified as T +import Data.Typeable import Foreign.C.Types import Foreign.Ptr @@ -67,6 +69,7 @@ data ShellCommand = ShellCommand } newtype ShellArguments = ShellArguments { fromShellArguments :: [ ShellArgument ] } + deriving (Semigroup, Monoid) data ShellArgument = ShellArgument Text @@ -97,10 +100,25 @@ instance ExprType ShellArguments where textExprType _ = T.pack "ShellArguments" textExprValue _ = "<shell-arguments>" + exprExpansionConvFrom = listToMaybe $ catMaybes + [ cast (ShellArguments . (: []) . ShellArgument) + , cast (ShellArguments . (: []) . ShellArgument . T.pack . show @Integer) + , cast (ShellArguments . (: []) . ShellArgument . T.pack . show @Scientific) + , cast (ShellArguments . map ShellArgument) + , cast (ShellArguments . map (ShellArgument . T.pack . show @Integer)) + , cast (ShellArguments . map (ShellArgument . T.pack . show @Scientific)) + ] + instance ExprType ShellArgument where textExprType _ = T.pack "ShellArgument" textExprValue _ = "<shell-argument>" + exprExpansionConvFrom = listToMaybe $ catMaybes + [ cast (ShellArgument) + , cast (ShellArgument . T.pack . show @Integer) + , cast (ShellArgument . T.pack . show @Scientific) + ] + data ShellExecInfo = ShellExecInfo { seiNode :: Node |