Add program version in help and a separate --version flag
This commit is contained in:
parent
844cc5a638
commit
9d22da4c8b
1 changed files with 37 additions and 14 deletions
|
@ -5,12 +5,14 @@ module Arguments (
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Monoid ((<>))
|
import Data.Monoid ((<>))
|
||||||
|
import Data.Version (showVersion)
|
||||||
import Options.Applicative
|
import Options.Applicative
|
||||||
|
import qualified Paths_hablo as Hablo (version)
|
||||||
import System.Directory (doesDirectoryExist, doesFileExist, makeAbsolute)
|
import System.Directory (doesDirectoryExist, doesFileExist, makeAbsolute)
|
||||||
import System.Exit (die)
|
import System.Exit (die, exitSuccess)
|
||||||
import System.FilePath.Posix (dropTrailingPathSeparator, isValid)
|
import System.FilePath.Posix (dropTrailingPathSeparator, isValid)
|
||||||
|
|
||||||
data Arguments = Arguments {
|
data Arguments = BlogConfig {
|
||||||
sourceDir :: FilePath
|
sourceDir :: FilePath
|
||||||
, blogName :: Maybe String
|
, blogName :: Maybe String
|
||||||
, previewArticlesCount :: Int
|
, previewArticlesCount :: Int
|
||||||
|
@ -18,9 +20,10 @@ data Arguments = Arguments {
|
||||||
, bannerPath :: Maybe FilePath
|
, bannerPath :: Maybe FilePath
|
||||||
, headPath :: Maybe FilePath
|
, headPath :: Maybe FilePath
|
||||||
}
|
}
|
||||||
|
| Version
|
||||||
|
|
||||||
parseArguments :: Parser Arguments
|
blogConfig :: Parser Arguments
|
||||||
parseArguments = Arguments
|
blogConfig = BlogConfig
|
||||||
<$> argument filePath (metavar "INPUT_DIR")
|
<$> argument filePath (metavar "INPUT_DIR")
|
||||||
<*> option (optional str) (
|
<*> option (optional str) (
|
||||||
metavar "BLOG_NAME"
|
metavar "BLOG_NAME"
|
||||||
|
@ -58,6 +61,16 @@ parseArguments = Arguments
|
||||||
<> help "path to the file to add in the blog's head"
|
<> help "path to the file to add in the blog's head"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
version :: Parser Arguments
|
||||||
|
version = flag' Version (
|
||||||
|
long "version"
|
||||||
|
<> short 'v'
|
||||||
|
<> help "print the version number"
|
||||||
|
)
|
||||||
|
|
||||||
|
arguments :: Parser Arguments
|
||||||
|
arguments = blogConfig <|> version
|
||||||
|
|
||||||
filePath :: ReadM FilePath
|
filePath :: ReadM FilePath
|
||||||
filePath = eitherReader $ \path ->
|
filePath = eitherReader $ \path ->
|
||||||
if isValid path
|
if isValid path
|
||||||
|
@ -71,16 +84,16 @@ ifNotDie check messageBuilder input = do
|
||||||
then return ()
|
then return ()
|
||||||
else die $ messageBuilder input
|
else die $ messageBuilder input
|
||||||
|
|
||||||
get :: IO Arguments
|
checkAndMakeAbsolute :: Arguments -> IO Arguments
|
||||||
get = do
|
checkAndMakeAbsolute Version = return Version
|
||||||
arguments <- execParser $ info (parseArguments <**> helper) fullDesc
|
checkAndMakeAbsolute aBlogConfig = do
|
||||||
doesDirectoryExist `ifNotDie` noSuchDirectory $ sourceDir arguments
|
doesDirectoryExist `ifNotDie` noSuchDirectory $ sourceDir aBlogConfig
|
||||||
absoluteSourceDir <- makeAbsolute $ sourceDir arguments
|
absoluteSourceDir <- makeAbsolute $ sourceDir aBlogConfig
|
||||||
mapM_ (doesFileExist `ifNotDie` noSuchFile) $ bannerPath arguments
|
mapM_ (doesFileExist `ifNotDie` noSuchFile) $ bannerPath aBlogConfig
|
||||||
absoluteBannerPath <- mapM makeAbsolute $ bannerPath arguments
|
absoluteBannerPath <- mapM makeAbsolute $ bannerPath aBlogConfig
|
||||||
mapM_ (doesFileExist `ifNotDie` noSuchFile) $ headPath arguments
|
mapM_ (doesFileExist `ifNotDie` noSuchFile) $ headPath aBlogConfig
|
||||||
absoluteHeadPath <- mapM makeAbsolute $ headPath arguments
|
absoluteHeadPath <- mapM makeAbsolute $ headPath aBlogConfig
|
||||||
return $ arguments {
|
return $ aBlogConfig {
|
||||||
sourceDir = absoluteSourceDir
|
sourceDir = absoluteSourceDir
|
||||||
, bannerPath = absoluteBannerPath
|
, bannerPath = absoluteBannerPath
|
||||||
, headPath = absoluteHeadPath
|
, headPath = absoluteHeadPath
|
||||||
|
@ -88,3 +101,13 @@ get = do
|
||||||
where
|
where
|
||||||
noSuchDirectory = (++ ": no such directory")
|
noSuchDirectory = (++ ": no such directory")
|
||||||
noSuchFile = (++ ": no such file")
|
noSuchFile = (++ ": no such file")
|
||||||
|
|
||||||
|
get :: IO Arguments
|
||||||
|
get = do
|
||||||
|
args <- execParser $
|
||||||
|
info
|
||||||
|
(arguments <**> helper)
|
||||||
|
(fullDesc <> header ("Hablo v" ++ showVersion Hablo.version))
|
||||||
|
case args of
|
||||||
|
Version -> (putStrLn $ showVersion Hablo.version) >> exitSuccess
|
||||||
|
BlogConfig {} -> checkAndMakeAbsolute args
|
||||||
|
|
Loading…
Reference in a new issue