-- |
-- Module: Options.Types
-- License: MIT
module Options.Types
        ( OptionDefinitions(..)
        , Group(..)
        , OptionKey(..)
        , Location(..)
        , OptionInfo(..)
        ) where

data OptionDefinitions = OptionDefinitions [OptionInfo] [(String, [OptionInfo])]

data Group = Group
        {
          groupName :: String

        -- | A short title for the group, which is used when printing
        -- @--help@ output.
        , groupTitle :: String

        -- | A description of the group, which is used when printing
        -- @--help@ output.
        , groupDescription :: String
        }
        deriving (Eq, Show)

data OptionKey
        = OptionKey String
        | OptionKeyHelpSummary
        | OptionKeyHelpGroup String
        | OptionKeyGenerated Integer
        | OptionKeyIgnored
        deriving (Eq, Ord, Show)

data Location = Location
        { locationPackage :: String
        , locationModule :: String
        , locationFilename :: String
        , locationLine :: Integer
        }
        deriving (Eq, Show)

data OptionInfo = OptionInfo
        { optionInfoKey :: OptionKey
        , optionInfoShortFlags :: [Char]
        , optionInfoLongFlags :: [String]
        , optionInfoDefault :: String
        , optionInfoUnary :: Bool
        , optionInfoUnaryOnly :: Bool  -- used only for --help and friends
        , optionInfoDescription :: String
        , optionInfoGroup :: Maybe Group
        , optionInfoLocation :: Maybe Location
        , optionInfoTypeName :: String
        }
        deriving (Eq, Show)