Iris.need is the main function for checking whether a specified tool executable in PATH:
need :: MonadIO m => [Tool] -> m ()
It supposed to be used like this in the main application code:
app :: App ()
app = Iris.asksCliEnv Iris.cliEnvCmd >>= \case
Download url -> do
need ["curl"]
runDownload url
Evaluate hs -> do
need ["ghc", "cabal"]
runEvaluate hs
Where the Tool type is the following:
|
data Tool = Tool |
|
{ toolName :: Text |
|
-- ^ @since 0.0.0.0 |
|
, toolSelector :: Maybe ToolSelector |
|
-- ^ @since 0.0.0.0 |
|
} |
|
|
|
{- | |
|
|
|
@since 0.0.0.0 |
|
-} |
|
instance IsString Tool where |
|
fromString :: String -> Tool |
|
fromString s = |
|
Tool |
|
{ toolName = fromString s |
|
, toolSelector = Nothing |
|
} |
|
|
|
{- | |
|
|
|
@since 0.0.0.0 |
|
-} |
|
data ToolSelector = ToolSelector |
|
{ toolSelectorFunction :: Text -> Bool |
|
-- ^ @since 0.0.0.0 |
|
, toolSelectorVersionArg :: Maybe Text |
|
-- ^ @since 0.0.0.0 |
|
} |
It does the job but it's a bit suboptimal and maybe inconvenient at times.
I'd love to improve this API in the following way:
With such an eDSL, it should be possible to write the following code:
ghc :: Iris.Tool
ghc = "ghc" `Iris.versionAtLeast` [8, 10, 7] `Iris.usingVersionFlag` "--numeric-version"
cabal :: Iris.Tool
cabal = "cabal" `Iris.versionAtLeast` [3, 6, 2, 0] `Iris.usingVersionFlag` "--numeric-version"
app :: App ()
app = Iris.asksCliEnv Iris.cliEnvCmd >>= \case
Download url -> do
need ["curl"]
runDownload url
Evaluate hs -> do
need [ghc, cabal]
runEvaluate hs
The checkToolFunction should patched accordingly.
Iris.needis the main function for checking whether a specified tool executable in PATH:It supposed to be used like this in the main application code:
Where the
Tooltype is the following:iris/src/Iris/Tool.hs
Lines 43 to 71 in c1597ee
It does the job but it's a bit suboptimal and maybe inconvenient at times.
I'd love to improve this API in the following way:
With such an eDSL, it should be possible to write the following code:
The
checkToolFunctionshould patched accordingly.