{-# LANGUAGE OverloadedStrings, StrictData #-}
-- |
-- Module: NetSpider.CLI.Spider
-- Description: CLI option parser for Spider's Config
-- Maintainer: Toshio Ito <toshio9.ito@toshiba.co.jp>
--
-- This module define CLI option parser for 'SpiderConfig'.
module NetSpider.CLI.Spider
  ( parserSpiderConfig,
    SpiderConfig
  ) where

import Control.Applicative ((<$>), (<*>), many, pure)
import Data.Greskell.Greskell (toGremlin)
import Data.Monoid (mconcat)
import Data.Text (unpack)
import qualified NetSpider.Spider.Config as SConf
import qualified NetSpider.Spider as Sp
import qualified Options.Applicative as Opt

-- | 'SConf.Config' of the Spider.
type SpiderConfig = SConf.Config

-- | Command-line option parser for 'SConf.Config' of 'Spider'.
parserSpiderConfig :: Opt.Parser (SpiderConfig n na fla)
parserSpiderConfig :: Parser (SpiderConfig n na fla)
parserSpiderConfig =
  Host -> Port -> Key VNode n -> LogLevel -> SpiderConfig n na fla
forall n na fla.
Host -> Port -> Key VNode n -> LogLevel -> Config n na fla
SConf.Config (Host -> Port -> Key VNode n -> LogLevel -> SpiderConfig n na fla)
-> Parser Host
-> Parser
     (Port -> Key VNode n -> LogLevel -> SpiderConfig n na fla)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Host
host Parser (Port -> Key VNode n -> LogLevel -> SpiderConfig n na fla)
-> Parser Port
-> Parser (Key VNode n -> LogLevel -> SpiderConfig n na fla)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Port
port Parser (Key VNode n -> LogLevel -> SpiderConfig n na fla)
-> Parser (Key VNode n)
-> Parser (LogLevel -> SpiderConfig n na fla)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Key VNode n)
node_id_key Parser (LogLevel -> SpiderConfig n na fla)
-> Parser LogLevel -> Parser (SpiderConfig n na fla)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser LogLevel
log_thresh
  where
    host :: Parser Host
host = Mod OptionFields Host -> Parser Host
forall s. IsString s => Mod OptionFields s -> Parser s
Opt.strOption (Mod OptionFields Host -> Parser Host)
-> Mod OptionFields Host -> Parser Host
forall a b. (a -> b) -> a -> b
$ [Mod OptionFields Host] -> Mod OptionFields Host
forall a. Monoid a => [a] -> a
mconcat
           [ Host -> Mod OptionFields Host
forall (f :: * -> *) a. HasName f => Host -> Mod f a
Opt.long Host
"host",
             Host -> Mod OptionFields Host
forall (f :: * -> *) a. Host -> Mod f a
Opt.help Host
"Hostname or address of Gremlin Server",
             Host -> Mod OptionFields Host
forall (f :: * -> *) a. HasMetavar f => Host -> Mod f a
Opt.metavar Host
"HOSTNAME",
             Host -> Mod OptionFields Host
forall (f :: * -> *) a. HasValue f => a -> Mod f a
Opt.value Host
"localhost",
             Mod OptionFields Host
forall a (f :: * -> *). Show a => Mod f a
Opt.showDefault
           ]
    port :: Parser Port
port = ReadM Port -> Mod OptionFields Port -> Parser Port
forall a. ReadM a -> Mod OptionFields a -> Parser a
Opt.option ReadM Port
forall a. Read a => ReadM a
Opt.auto (Mod OptionFields Port -> Parser Port)
-> Mod OptionFields Port -> Parser Port
forall a b. (a -> b) -> a -> b
$ [Mod OptionFields Port] -> Mod OptionFields Port
forall a. Monoid a => [a] -> a
mconcat
           [ Host -> Mod OptionFields Port
forall (f :: * -> *) a. HasName f => Host -> Mod f a
Opt.long Host
"port",
             Host -> Mod OptionFields Port
forall (f :: * -> *) a. Host -> Mod f a
Opt.help Host
"Port number of Gremlin Server WebSocket endpoint",
             Host -> Mod OptionFields Port
forall (f :: * -> *) a. HasMetavar f => Host -> Mod f a
Opt.metavar Host
"PORT",
             Port -> Mod OptionFields Port
forall (f :: * -> *) a. HasValue f => a -> Mod f a
Opt.value Port
8182,
             Mod OptionFields Port
forall a (f :: * -> *). Show a => Mod f a
Opt.showDefault
           ]
    node_id_key :: Parser (Key VNode n)
node_id_key = Mod OptionFields (Key VNode n) -> Parser (Key VNode n)
forall s. IsString s => Mod OptionFields s -> Parser s
Opt.strOption (Mod OptionFields (Key VNode n) -> Parser (Key VNode n))
-> Mod OptionFields (Key VNode n) -> Parser (Key VNode n)
forall a b. (a -> b) -> a -> b
$ [Mod OptionFields (Key VNode n)] -> Mod OptionFields (Key VNode n)
forall a. Monoid a => [a] -> a
mconcat
                  [ Host -> Mod OptionFields (Key VNode n)
forall (f :: * -> *) a. HasName f => Host -> Mod f a
Opt.long Host
"node-id-key",
                    Host -> Mod OptionFields (Key VNode n)
forall (f :: * -> *) a. Host -> Mod f a
Opt.help Host
"Name of vertex attriute that stores Node ID.",
                    Host -> Mod OptionFields (Key VNode n)
forall (f :: * -> *) a. HasMetavar f => Host -> Mod f a
Opt.metavar Host
"KEY",
                    Key VNode n -> Mod OptionFields (Key VNode n)
forall (f :: * -> *) a. HasValue f => a -> Mod f a
Opt.value Key VNode n
"@node_id",
                    (Key VNode n -> Host) -> Mod OptionFields (Key VNode n)
forall a (f :: * -> *). (a -> Host) -> Mod f a
Opt.showDefaultWith (Text -> Host
unpack (Text -> Host) -> (Key VNode n -> Text) -> Key VNode n -> Host
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Key VNode n -> Text
forall a. ToGreskell a => a -> Text
toGremlin)
                  ]
    log_thresh :: Parser LogLevel
log_thresh = ([()] -> LogLevel) -> Parser [()] -> Parser LogLevel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Port -> LogLevel
logLevelFromVerbosity (Port -> LogLevel) -> ([()] -> Port) -> [()] -> LogLevel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [()] -> Port
forall (t :: * -> *) a. Foldable t => t a -> Port
length) (Parser [()] -> Parser LogLevel) -> Parser [()] -> Parser LogLevel
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser [()]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser () -> Parser [()]) -> Parser () -> Parser [()]
forall a b. (a -> b) -> a -> b
$ () -> Mod FlagFields () -> Parser ()
forall a. a -> Mod FlagFields a -> Parser a
Opt.flag' () (Mod FlagFields () -> Parser ()) -> Mod FlagFields () -> Parser ()
forall a b. (a -> b) -> a -> b
$ [Mod FlagFields ()] -> Mod FlagFields ()
forall a. Monoid a => [a] -> a
mconcat
                 [ Char -> Mod FlagFields ()
forall (f :: * -> *) a. HasName f => Char -> Mod f a
Opt.short Char
'v',
                   Host -> Mod FlagFields ()
forall (f :: * -> *) a. HasName f => Host -> Mod f a
Opt.long Host
"verbose",
                   Host -> Mod FlagFields ()
forall (f :: * -> *) a. Host -> Mod f a
Opt.help Host
"Verbose log output. Specify multiple times to make it more verbose."
                 ]

logLevelFromVerbosity :: Int -> SConf.LogLevel
logLevelFromVerbosity :: Port -> LogLevel
logLevelFromVerbosity Port
2 = LogLevel
SConf.LevelDebug
logLevelFromVerbosity Port
1 = LogLevel
SConf.LevelInfo
logLevelFromVerbosity Port
_ = LogLevel
SConf.LevelWarn