packages feed

iris-0.1.0.0: src/Iris/Cli/Version.hs

{- |
Module                  : Iris.Cli.Version
Copyright               : (c) 2022 Dmitrii Kovanikov
SPDX-License-Identifier : MPL-2.0
Maintainer              : Dmitrii Kovanikov <kovanikov@gmail.com>
Stability               : Experimental
Portability             : Portable

CLI options parsing for @--version@ and @--numeric-version@

__Enabled with config__

@since 0.0.0.0
-}
module Iris.Cli.Version (
    -- * Settings
    VersionSettings (..),
    defaultVersionSettings,

    -- * CLI parser
    fullVersionP,

    -- * Internal helpers
    mkVersionParser,
) where

import Data.Version (Version, showVersion)

import qualified Options.Applicative as Opt

{- |

@since 0.0.0.0
-}
data VersionSettings = VersionSettings
    { versionSettingsVersion :: Version
    -- ^ @since 0.0.0.0
    , versionSettingsMkDesc :: String -> String
    -- ^ @since 0.0.0.0
    }

{- |

@since 0.0.0.0
-}
defaultVersionSettings :: Version -> VersionSettings
defaultVersionSettings version =
    VersionSettings
        { versionSettingsVersion = version
        , versionSettingsMkDesc = id
        }

{- |

@since 0.0.0.0
-}
mkVersionParser :: Maybe VersionSettings -> Opt.Parser (a -> a)
mkVersionParser = maybe (pure id) fullVersionP

{- |

@since 0.0.0.0
-}
fullVersionP :: VersionSettings -> Opt.Parser (a -> a)
fullVersionP VersionSettings{..} = versionP <*> numericVersionP
  where
    versionStr :: String
    versionStr = showVersion versionSettingsVersion

    versionP :: Opt.Parser (a -> a)
    versionP =
        Opt.infoOption (versionSettingsMkDesc versionStr) $
            mconcat
                [ Opt.long "version"
                , Opt.help "Show application version"
                ]

    numericVersionP :: Opt.Parser (a -> a)
    numericVersionP =
        Opt.infoOption versionStr $
            mconcat
                [ Opt.long "numeric-version"
                , Opt.help "Show only numeric application version"
                ]