-- |
-- /NOTE:/ This module is not meant for public consumption.  For user
-- documentation look at http://hspec.github.io/hspec-discover.html.
module Test.Hspec.Discover.Config (
  Config (..)
, defaultConfig
, parseConfig
, usage
) where

import           Data.Maybe
import           System.Console.GetOpt

data Config = Config {
  Config -> Bool
configNested :: Bool
, Config -> Maybe String
configFormatter :: Maybe String
, Config -> Bool
configNoMain :: Bool
, Config -> Maybe String
configModuleName :: Maybe String
} deriving (Config -> Config -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Config -> Config -> Bool
$c/= :: Config -> Config -> Bool
== :: Config -> Config -> Bool
$c== :: Config -> Config -> Bool
Eq, Int -> Config -> ShowS
[Config] -> ShowS
Config -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Config] -> ShowS
$cshowList :: [Config] -> ShowS
show :: Config -> String
$cshow :: Config -> String
showsPrec :: Int -> Config -> ShowS
$cshowsPrec :: Int -> Config -> ShowS
Show)

defaultConfig :: Config
defaultConfig :: Config
defaultConfig = Bool -> Maybe String -> Bool -> Maybe String -> Config
Config Bool
False forall a. Maybe a
Nothing Bool
False forall a. Maybe a
Nothing

options :: [OptDescr (Config -> Config)]
options :: [OptDescr (Config -> Config)]
options = [
    forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] [String
"nested"] (forall a. a -> ArgDescr a
NoArg forall a b. (a -> b) -> a -> b
$ \Config
c -> Config
c {configNested :: Bool
configNested = Bool
True}) String
""
  , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] [String
"formatter"] (forall a. (String -> a) -> String -> ArgDescr a
ReqArg (\String
s Config
c -> Config
c {configFormatter :: Maybe String
configFormatter = forall a. a -> Maybe a
Just String
s}) String
"FORMATTER") String
""
  , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] [String
"module-name"] (forall a. (String -> a) -> String -> ArgDescr a
ReqArg (\String
s Config
c -> Config
c {configModuleName :: Maybe String
configModuleName = forall a. a -> Maybe a
Just String
s}) String
"NAME") String
""
  , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] [String
"no-main"] (forall a. a -> ArgDescr a
NoArg forall a b. (a -> b) -> a -> b
$ \Config
c   -> Config
c {configNoMain :: Bool
configNoMain = Bool
True}) String
""
  ]

usage :: String -> String
usage :: ShowS
usage String
prog = String
"\nUsage: " forall a. [a] -> [a] -> [a]
++ String
prog forall a. [a] -> [a] -> [a]
++ String
" SRC CUR DST [--module-name=NAME]\n"

parseConfig :: String -> [String] -> Either String Config
parseConfig :: String -> [String] -> Either String Config
parseConfig String
prog [String]
args = case forall a.
ArgOrder a -> [OptDescr a] -> [String] -> ([a], [String], [String])
getOpt forall a. ArgOrder a
Permute [OptDescr (Config -> Config)]
options [String]
args of
    ([Config -> Config]
opts, [], []) -> let
        c :: Config
c = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. a -> a
id) Config
defaultConfig [Config -> Config]
opts
      in
        if Config -> Bool
configNoMain Config
c Bool -> Bool -> Bool
&& forall a. Maybe a -> Bool
isJust (Config -> Maybe String
configFormatter Config
c)
           then
             forall {b}. String -> Either String b
formatError String
"option `--formatter=<fmt>' does not make sense with `--no-main'\n"
           else
             forall a b. b -> Either a b
Right Config
c
    ([Config -> Config]
_, [String]
_, String
err:[String]
_)  -> forall {b}. String -> Either String b
formatError String
err
    ([Config -> Config]
_, String
arg:[String]
_, [String]
_)  -> forall {b}. String -> Either String b
formatError (String
"unexpected argument `" forall a. [a] -> [a] -> [a]
++ String
arg forall a. [a] -> [a] -> [a]
++ String
"'\n")
  where
    formatError :: String -> Either String b
formatError String
err = forall a b. a -> Either a b
Left (String
prog forall a. [a] -> [a] -> [a]
++ String
": " forall a. [a] -> [a] -> [a]
++ String
err forall a. [a] -> [a] -> [a]
++ ShowS
usage String
prog)