module ProjectM36.Server.ParseArgs where
import ProjectM36.Base
import ProjectM36.Client
import Options.Applicative
import ProjectM36.Server.Config
#if __GLASGOW_HASKELL__ < 804
import Data.Monoid
#endif

parseArgsWithDefaults :: ServerConfig -> Parser ServerConfig
parseArgsWithDefaults :: ServerConfig -> Parser ServerConfig
parseArgsWithDefaults ServerConfig
defaults = PersistenceStrategy
-> Bool
-> String
-> String
-> Port
-> [String]
-> Int
-> Bool
-> ServerConfig
ServerConfig forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 Parser PersistenceStrategy
parsePersistenceStrategy forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Parser Bool
parseCheckFS forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Parser String
parseDatabaseName forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 String -> Parser String
parseHostname (ServerConfig -> String
bindHost ServerConfig
defaults) forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Port -> Parser Port
parsePort (ServerConfig -> Port
bindPort ServerConfig
defaults) forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser String
parseGhcPkgPath forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Int -> Parser Int
parseTimeout (ServerConfig -> Int
perRequestTimeout ServerConfig
defaults) forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Parser Bool
parseTestMode

parsePersistenceStrategy :: Parser PersistenceStrategy
parsePersistenceStrategy :: Parser PersistenceStrategy
parsePersistenceStrategy = String -> PersistenceStrategy
CrashSafePersistence forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser String
dbdirOpt forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Bool
fsyncOpt) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
                           String -> PersistenceStrategy
MinimalPersistence forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
dbdirOpt forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
                           forall (f :: * -> *) a. Applicative f => a -> f a
pure PersistenceStrategy
NoPersistence
  where
    dbdirOpt :: Parser String
dbdirOpt = forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'd' forall a. Semigroup a => a -> a -> a
<>
                          forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"database-directory" forall a. Semigroup a => a -> a -> a
<>
                          forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"DIRECTORY" forall a. Semigroup a => a -> a -> a
<>
                          forall a (f :: * -> *). (a -> String) -> Mod f a
showDefaultWith forall a. Show a => a -> String
show
                         )
    fsyncOpt :: Parser Bool
fsyncOpt = Mod FlagFields Bool -> Parser Bool
switch (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'f' forall a. Semigroup a => a -> a -> a
<>
                    forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"fsync" forall a. Semigroup a => a -> a -> a
<>
                    forall (f :: * -> *) a. String -> Mod f a
help String
"Fsync all new transactions.")

parseTestMode :: Parser Bool
parseTestMode :: Parser Bool
parseTestMode = forall a. a -> a -> Mod FlagFields a -> Parser a
flag Bool
True Bool
False (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"test-mode" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. Mod f a
hidden)

parseCheckFS :: Parser Bool
parseCheckFS :: Parser Bool
parseCheckFS = forall a. a -> a -> Mod FlagFields a -> Parser a
flag Bool
True Bool
False (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"disable-fscheck" forall a. Semigroup a => a -> a -> a
<>
                                forall (f :: * -> *) a. String -> Mod f a
help String
"Disable filesystem check for journaling.")

parseDatabaseName :: Parser DatabaseName
parseDatabaseName :: Parser String
parseDatabaseName = forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'n' forall a. Semigroup a => a -> a -> a
<>
                               forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"database" forall a. Semigroup a => a -> a -> a
<>
                               forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"DATABASE_NAME")

parseHostname :: Hostname -> Parser Hostname
parseHostname :: String -> Parser String
parseHostname String
defHostname = forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'h' forall a. Semigroup a => a -> a -> a
<>
                           forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"hostname" forall a. Semigroup a => a -> a -> a
<>
                           forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"HOST_NAME" forall a. Semigroup a => a -> a -> a
<>
                           forall (f :: * -> *) a. HasValue f => a -> Mod f a
value String
defHostname)

parsePort :: Port -> Parser Port
parsePort :: Port -> Parser Port
parsePort Port
defPort = forall a. ReadM a -> Mod OptionFields a -> Parser a
option forall a. Read a => ReadM a
auto (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'p' forall a. Semigroup a => a -> a -> a
<>
                         forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"port" forall a. Semigroup a => a -> a -> a
<>
                         forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PORT_NUMBER" forall a. Semigroup a => a -> a -> a
<>
                         forall (f :: * -> *) a. HasValue f => a -> Mod f a
value Port
defPort)

parseGhcPkgPath :: Parser String
parseGhcPkgPath :: Parser String
parseGhcPkgPath = forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ghc-pkg-dir" forall a. Semigroup a => a -> a -> a
<>
                              forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"GHC_PACKAGE_DIRECTORY")

parseTimeout :: Int -> Parser Int
parseTimeout :: Int -> Parser Int
parseTimeout Int
defTimeout = forall a. ReadM a -> Mod OptionFields a -> Parser a
option forall a. Read a => ReadM a
auto (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"timeout" forall a. Semigroup a => a -> a -> a
<>
                            forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"MICROSECONDS" forall a. Semigroup a => a -> a -> a
<>
                            forall (f :: * -> *) a. HasValue f => a -> Mod f a
value Int
defTimeout)

parseConfig :: IO ServerConfig
parseConfig :: IO ServerConfig
parseConfig = ServerConfig -> IO ServerConfig
parseConfigWithDefaults ServerConfig
defaultServerConfig

parseConfigWithDefaults :: ServerConfig -> IO ServerConfig
parseConfigWithDefaults :: ServerConfig -> IO ServerConfig
parseConfigWithDefaults ServerConfig
defaults = forall a. ParserInfo a -> IO a
execParser (forall a. Parser a -> InfoMod a -> ParserInfo a
info (ServerConfig -> Parser ServerConfig
parseArgsWithDefaults ServerConfig
defaults forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> forall a. Parser (a -> a)
helpOption) forall m. Monoid m => m
idm)

parseWSConfigWithDefaults :: ServerConfig -> IO WebsocketServerConfig
parseWSConfigWithDefaults :: ServerConfig -> IO WebsocketServerConfig
parseWSConfigWithDefaults ServerConfig
defaults = forall a. ParserInfo a -> IO a
execParser (forall a. Parser a -> InfoMod a -> ParserInfo a
info (ServerConfig -> Parser WebsocketServerConfig
parseWSArgsWithDefaults ServerConfig
defaults forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> forall a. Parser (a -> a)
helpOption) forall m. Monoid m => m
idm)

parseWSArgsWithDefaults :: ServerConfig -> Parser WebsocketServerConfig
parseWSArgsWithDefaults :: ServerConfig -> Parser WebsocketServerConfig
parseWSArgsWithDefaults ServerConfig
defaults = ServerConfig
-> Maybe String -> Maybe String -> WebsocketServerConfig
WebsocketServerConfig forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 ServerConfig -> Parser ServerConfig
parseArgsWithDefaults ServerConfig
defaults forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Parser (Maybe String)
parseTlsCertificatePath forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Parser (Maybe String)
parseTlsKeyPath


parseTlsCertificatePath :: Parser (Maybe String)
parseTlsCertificatePath :: Parser (Maybe String)
parseTlsCertificatePath = forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional forall a b. (a -> b) -> a -> b
$ forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"tls-certificate-path" forall a. Semigroup a => a -> a -> a
<>
                              forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TLS_CERTIFICATE_PATH")

parseTlsKeyPath :: Parser (Maybe String)
parseTlsKeyPath :: Parser (Maybe String)
parseTlsKeyPath = forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional forall a b. (a -> b) -> a -> b
$ forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"tls-key-path" forall a. Semigroup a => a -> a -> a
<>
                              forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TLS_KEY_PATH")

helpOption :: Parser (a -> a)
helpOption :: forall a. Parser (a -> a)
helpOption = forall a.
ParseError -> Mod OptionFields (a -> a) -> Parser (a -> a)
abortOption ParseError
helpText forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
  [ forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"help"
  , forall (f :: * -> *) a. String -> Mod f a
help String
"Show this help text"
  , forall (f :: * -> *) a. Mod f a
hidden ]
  where
#if MIN_VERSION_optparse_applicative(0,16,0)
    helpText :: ParseError
helpText = Maybe String -> ParseError
ShowHelpText forall a. Maybe a
Nothing
#else
    helpText = ShowHelpText
#endif