    -- |
    -- 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)