{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE RecordWildCards #-}
module SnelstartImport.Options
( parseProgram,
CliOptions(..),
ProgramOptions (..),
WebOptions(..)
)
where
import Data.Text
import Options.Applicative
data CliOptions = CliOptions {
CliOptions -> Text
cliOwnAccount :: Text
, CliOptions -> [Char]
cliInputFile :: FilePath
, CliOptions -> [Char]
cliOutputFile :: FilePath
}
data WebOptions = WebOptions {
WebOptions -> Int
webPort :: Int
}
data ProgramOptions = Convert CliOptions
| Webserver WebOptions
parseWebOptions :: Parser WebOptions
parseWebOptions :: Parser WebOptions
parseWebOptions = do
Int
webPort <- (ReadM Int -> Mod OptionFields Int -> Parser Int
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
ReadM Int
forall a. Read a => ReadM a
auto
( [Char] -> Mod OptionFields Int
forall (f :: * -> *) a. HasName f => [Char] -> Mod f a
long [Char]
"port"
Mod OptionFields Int
-> Mod OptionFields Int -> Mod OptionFields Int
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields Int
forall (f :: * -> *) a. [Char] -> Mod f a
help
[Char]
"port to bind on"
Mod OptionFields Int
-> Mod OptionFields Int -> Mod OptionFields Int
forall a. Semigroup a => a -> a -> a
<> Int -> Mod OptionFields Int
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value Int
3005
)
)
pure $ WebOptions{Int
webPort :: Int
webPort :: Int
..}
parseCli :: Parser CliOptions
parseCli :: Parser CliOptions
parseCli = do
[Char]
cliInputFile <- ReadM [Char] -> Mod OptionFields [Char] -> Parser [Char]
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM [Char]
forall s. IsString s => ReadM s
str (Char -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'i' Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasName f => [Char] -> Mod f a
long [Char]
"input-file" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasMetavar f => [Char] -> Mod f a
metavar [Char]
"FILE" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. [Char] -> Mod f a
help [Char]
"The input file" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value [Char]
"input.csv" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields [Char]
forall a (f :: * -> *). Show a => Mod f a
showDefault)
[Char]
cliOutputFile <- ReadM [Char] -> Mod OptionFields [Char] -> Parser [Char]
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM [Char]
forall s. IsString s => ReadM s
str (Char -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'o' Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasName f => [Char] -> Mod f a
long [Char]
"output-file" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasMetavar f => [Char] -> Mod f a
metavar [Char]
"FILE" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. [Char] -> Mod f a
help [Char]
"The output file" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields [Char]
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value [Char]
"out.csv" Mod OptionFields [Char]
-> Mod OptionFields [Char] -> Mod OptionFields [Char]
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields [Char]
forall a (f :: * -> *). Show a => Mod f a
showDefault)
Text
cliOwnAccount <- ReadM Text -> Mod OptionFields Text -> Parser Text
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM Text
forall s. IsString s => ReadM s
str (Char -> Mod OptionFields Text
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'a' Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields Text
forall (f :: * -> *) a. HasName f => [Char] -> Mod f a
long [Char]
"own-account" Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields Text
forall (f :: * -> *) a. HasMetavar f => [Char] -> Mod f a
metavar [Char]
"ACCOUNT" Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> [Char] -> Mod OptionFields Text
forall (f :: * -> *) a. [Char] -> Mod f a
help [Char]
"The account written into" Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> Text -> Mod OptionFields Text
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value Text
"DE92100110012623092722" Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields Text
forall a (f :: * -> *). Show a => Mod f a
showDefault)
pure $ CliOptions {[Char]
Text
cliOwnAccount :: Text
cliInputFile :: [Char]
cliOutputFile :: [Char]
cliInputFile :: [Char]
cliOutputFile :: [Char]
cliOwnAccount :: Text
..}
parseProgram :: Parser ProgramOptions
parseProgram :: Parser ProgramOptions
parseProgram =
Mod CommandFields ProgramOptions -> Parser ProgramOptions
forall a. Mod CommandFields a -> Parser a
subparser (Mod CommandFields ProgramOptions -> Parser ProgramOptions)
-> Mod CommandFields ProgramOptions -> Parser ProgramOptions
forall a b. (a -> b) -> a -> b
$
[Char]
-> ParserInfo ProgramOptions -> Mod CommandFields ProgramOptions
forall a. [Char] -> ParserInfo a -> Mod CommandFields a
command [Char]
"convert" (Parser ProgramOptions
-> InfoMod ProgramOptions -> ParserInfo ProgramOptions
forall a. Parser a -> InfoMod a -> ParserInfo a
info (CliOptions -> ProgramOptions
Convert (CliOptions -> ProgramOptions)
-> Parser CliOptions -> Parser ProgramOptions
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser CliOptions
parseCli Parser ProgramOptions
-> Parser (ProgramOptions -> ProgramOptions)
-> Parser ProgramOptions
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> Parser (ProgramOptions -> ProgramOptions)
forall a. Parser (a -> a)
helper) (InfoMod ProgramOptions -> ParserInfo ProgramOptions)
-> InfoMod ProgramOptions -> ParserInfo ProgramOptions
forall a b. (a -> b) -> a -> b
$ [Char] -> InfoMod ProgramOptions
forall a. [Char] -> InfoMod a
progDesc [Char]
"Convert from cli to snelstart format")
Mod CommandFields ProgramOptions
-> Mod CommandFields ProgramOptions
-> Mod CommandFields ProgramOptions
forall a. Semigroup a => a -> a -> a
<>
[Char]
-> ParserInfo ProgramOptions -> Mod CommandFields ProgramOptions
forall a. [Char] -> ParserInfo a -> Mod CommandFields a
command [Char]
"server" (Parser ProgramOptions
-> InfoMod ProgramOptions -> ParserInfo ProgramOptions
forall a. Parser a -> InfoMod a -> ParserInfo a
info (WebOptions -> ProgramOptions
Webserver (WebOptions -> ProgramOptions)
-> Parser WebOptions -> Parser ProgramOptions
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser WebOptions
parseWebOptions Parser ProgramOptions
-> Parser (ProgramOptions -> ProgramOptions)
-> Parser ProgramOptions
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> Parser (ProgramOptions -> ProgramOptions)
forall a. Parser (a -> a)
helper) (InfoMod ProgramOptions -> ParserInfo ProgramOptions)
-> InfoMod ProgramOptions -> ParserInfo ProgramOptions
forall a b. (a -> b) -> a -> b
$ [Char] -> InfoMod ProgramOptions
forall a. [Char] -> InfoMod a
progDesc [Char]
"Start a server to give a UI to do conversion")