我有一个使用optparse-applicative
库进行 CLI 参数解析的 Haskell 应用程序。我的 CLI 参数数据类型包含FilePath
s(文件和目录),Double
s 等optparse-applicative
可以处理解析错误,但我想确保某些文件和某些目录存在(或不存在),数字是>= 0
等等。
可以做的是实现一堆帮助函数,比如这些:
exitIfM :: IO Bool -> Text -> IO ()
exitIfM predicateM errorMessage = whenM predicateM $ putTextLn errorMessage >> exitFailure
exitIfNotM :: IO Bool -> Text -> IO ()
exitIfNotM predicateM errorMessage = unlessM predicateM $ putTextLn errorMessage >> exitFailure
然后我像这样使用它:
body :: Options -> IO ()
body (Options path1 path2 path3 count) = do
exitIfNotM (doesFileExist path1) ("File " <> (toText ledgerPath) <> " does not exist")
exitIfNotM (doesDirectoryExist path2) ("Directory " <> (toText skKeysPath) <> " does not exist")
exitIfM (doesFileExist path3) ("File " <> (toText nodeExe) <> " already exist")
exitIf (count <= 0) ("--counter should be positive")
这对我来说看起来太临时和丑陋了。此外,我编写的几乎每个应用程序都需要类似的功能。当我想在实际使用数据类型做某事之前做一堆检查时,是否有一些惯用的方法来处理这种编程模式?涉及的样板越少越好:)