{- |
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
    { VersionSettings -> Version
versionSettingsVersion :: Version
    -- ^ @since 0.0.0.0
    , VersionSettings -> String -> String
versionSettingsMkDesc :: String -> String
    -- ^ @since 0.0.0.0
    }

{- |

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

{- |

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

{- |

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

    versionP :: Opt.Parser (a -> a)
    versionP :: forall a. Parser (a -> a)
versionP =
        forall a. String -> Mod OptionFields (a -> a) -> Parser (a -> a)
Opt.infoOption (String -> String
versionSettingsMkDesc String
versionStr) forall a b. (a -> b) -> a -> b
$
            forall a. Monoid a => [a] -> a
mconcat
                [ forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"version"
                , forall (f :: * -> *) a. String -> Mod f a
Opt.help String
"Show application version"
                ]

    numericVersionP :: Opt.Parser (a -> a)
    numericVersionP :: forall a. Parser (a -> a)
numericVersionP =
        forall a. String -> Mod OptionFields (a -> a) -> Parser (a -> a)
Opt.infoOption String
versionStr forall a b. (a -> b) -> a -> b
$
            forall a. Monoid a => [a] -> a
mconcat
                [ forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"numeric-version"
                , forall (f :: * -> *) a. String -> Mod f a
Opt.help String
"Show only numeric application version"
                ]