seihou-cli-0.6.0.0: src/Seihou/CLI/Extension.hs
module Seihou.CLI.Extension
( ExtensionRunOpts (..),
ExtensionRunError (..),
extensionExecutableName,
runExtension,
handleExtensionRun,
)
where
import Data.Generics.Labels ()
import Data.Text qualified as T
import Data.Text.IO qualified as TIO
import Seihou.Prelude
import System.Directory (findExecutable)
import System.Exit (ExitCode (..), exitWith)
import System.IO (hPutStrLn, stderr)
import System.Process (rawSystem)
data ExtensionRunOpts = ExtensionRunOpts
{ name :: !Text,
args :: ![String]
}
deriving stock (Eq, Generic, Show)
data ExtensionRunError
= ExtensionNotFound Text String
| ExtensionExited Text ExitCode
deriving stock (Eq, Show)
extensionExecutableName :: Text -> String
extensionExecutableName name =
"seihou-" <> T.unpack name <> "-extension"
runExtension :: ExtensionRunOpts -> IO (Either ExtensionRunError ())
runExtension opts = do
let exeName = extensionExecutableName (opts ^. #name)
found <- findExecutable exeName
case found of
Nothing ->
pure (Left (ExtensionNotFound (opts ^. #name) exeName))
Just exePath -> do
code <- rawSystem exePath (opts ^. #args)
pure $ case code of
ExitSuccess -> Right ()
failure -> Left (ExtensionExited (opts ^. #name) failure)
handleExtensionRun :: ExtensionRunOpts -> IO ()
handleExtensionRun opts = do
result <- runExtension opts
case result of
Right () ->
pure ()
Left (ExtensionNotFound _ exeName) -> do
hPutStrLn stderr ("error: extension executable not found: " <> exeName)
exitWith (ExitFailure 127)
Left (ExtensionExited name code) -> do
TIO.hPutStrLn stderr ("error: extension '" <> name <> "' exited with " <> T.pack (show code))
exitWith code