This commit is contained in:
voidlizard 2025-02-04 22:07:17 +03:00
parent 995710fce2
commit b91f0323e6
2 changed files with 33 additions and 0 deletions

View File

@ -12,6 +12,7 @@ import Data.Function
import Data.Text.Encoding.Error qualified as TE import Data.Text.Encoding.Error qualified as TE
import Data.Text.Encoding qualified as TE import Data.Text.Encoding qualified as TE
import Data.Text qualified as T import Data.Text qualified as T
import Data.Text (Text)
import Data.Typeable import Data.Typeable
import Prettyprinter import Prettyprinter
import System.Process.Typed import System.Process.Typed
@ -49,3 +50,25 @@ callProc name params syn = do
parseTop s & either (liftIO . throwIO) pure parseTop s & either (liftIO . throwIO) pure
pipeProcText :: forall m . MonadIO m
=> FilePath
-> [String]
-> Text
-> m Text
pipeProcText name params input' = do
let input = LBS.fromStrict (TE.encodeUtf8 input')
& byteStringInput
let what = proc name params & setStderr closed & setStdin input
(code, i, o) <- readProcess what
unless (code == ExitSuccess) do
liftIO $ hPrint stderr ( pretty $ LBS8.unpack o )
liftIO $ throwIO (CallProcException code)
pure $ TE.decodeUtf8With TE.lenientDecode (LBS.toStrict i)

View File

@ -1633,6 +1633,16 @@ internalEntries = do
_ -> throwIO (BadFormException @c nil) _ -> throwIO (BadFormException @c nil)
brief "call external process as pipe"
$ entry $ bindMatch "proc:pipe" \case
[StringLike name, ListVal (StringLikeList params), TextLike input ] -> lift do
mkStr @c <$> pipeProcText name params input
_ -> throwIO (BadFormException @c nil)
entry $ bindMatch "grep" \case entry $ bindMatch "grep" \case
[TextLike needle, what ] | matchOne needle what [TextLike needle, what ] | matchOne needle what
-> pure what -> pure what