{-# LANGUAGE OverloadedStrings          #-}
{-# OPTIONS_GHC -fno-warn-unused-imports#-}

module Data.KeyStore.CLI.Command
    ( CLI(..)
    , Command(..)
    , parseCLI
    , parseCLI'
    , cliInfo
    , cliParser
    , paramsParser
    , runParse
    )
    where

import           Data.KeyStore.KS.Opt
import           Data.KeyStore.Types
import           Data.KeyStore.IO.IC
import           Data.Monoid
import           Data.String
import           Text.KSRegex
import qualified Data.Text              as T
import           Options.Applicative
import           System.Environment
import           System.Exit
import           System.IO


data CLI =
    CLI
        { CLI -> CtxParams
cli_params    :: CtxParams
        , CLI -> Command
cli_command   :: Command
        }
    deriving (Int -> CLI -> ShowS
[CLI] -> ShowS
CLI -> String
(Int -> CLI -> ShowS)
-> (CLI -> String) -> ([CLI] -> ShowS) -> Show CLI
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CLI] -> ShowS
$cshowList :: [CLI] -> ShowS
show :: CLI -> String
$cshow :: CLI -> String
showsPrec :: Int -> CLI -> ShowS
$cshowsPrec :: Int -> CLI -> ShowS
Show)

data Command
    = Version
    | Keystore
    | Initialise        FilePath
    | UpdateSettings    FilePath
    | ListSettings
    | ListSettingOpts  (Maybe OptEnum)
    | AddTrigger        TriggerID Pattern FilePath
    | RmvTrigger        TriggerID
    | ListTriggers
    | Create            Name Comment Identity (Maybe EnvVar) (Maybe FilePath) [Safeguard]
    | CreateKeyPair     Name Comment Identity                                 [Safeguard]
    | Secure            Name                                 (Maybe FilePath) [Safeguard]
    | List
    | Info             [Name]
    | ShowIdentity      Bool Name
    | ShowComment       Bool Name
    | ShowDate          Bool Name
    | ShowHash          Bool Name
    | ShowHashComment   Bool Name
    | ShowHashSalt      Bool Name
    | ShowPublic        Bool Name
    | ShowSecret   Bool Name
    | Encrypt           Name    FilePath FilePath
    | Decrypt                   FilePath FilePath
    | Sign              Name    FilePath FilePath
    | Verify                    FilePath FilePath
    | Delete           [Name]
    deriving (Int -> Command -> ShowS
[Command] -> ShowS
Command -> String
(Int -> Command -> ShowS)
-> (Command -> String) -> ([Command] -> ShowS) -> Show Command
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Command] -> ShowS
$cshowList :: [Command] -> ShowS
show :: Command -> String
$cshow :: Command -> String
showsPrec :: Int -> Command -> ShowS
$cshowsPrec :: Int -> Command -> ShowS
Show)

parseCLI :: IO CLI
parseCLI :: IO CLI
parseCLI = IO [String]
getArgs IO [String] -> ([String] -> IO CLI) -> IO CLI
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [String] -> IO CLI
parseCLI'

parseCLI' :: [String] -> IO CLI
parseCLI' :: [String] -> IO CLI
parseCLI' = ParserInfo CLI -> [String] -> IO CLI
forall a. ParserInfo a -> [String] -> IO a
runParse ParserInfo CLI
cliInfo

cliInfo :: ParserInfo CLI
cliInfo :: ParserInfo CLI
cliInfo =
    Parser CLI -> InfoMod CLI -> ParserInfo CLI
forall a. Parser a -> InfoMod a -> ParserInfo a
info (Parser (CLI -> CLI)
forall a. Parser (a -> a)
helper Parser (CLI -> CLI) -> Parser CLI -> Parser CLI
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser CLI
cliParser)
        (   InfoMod CLI
forall a. InfoMod a
fullDesc
         InfoMod CLI -> InfoMod CLI -> InfoMod CLI
forall a. Semigroup a => a -> a -> a
<> String -> InfoMod CLI
forall a. String -> InfoMod a
progDesc String
"for storing secret things"
         InfoMod CLI -> InfoMod CLI -> InfoMod CLI
forall a. Semigroup a => a -> a -> a
<> String -> InfoMod CLI
forall a. String -> InfoMod a
header String
"ks - key store management"
         InfoMod CLI -> InfoMod CLI -> InfoMod CLI
forall a. Semigroup a => a -> a -> a
<> String -> InfoMod CLI
forall a. String -> InfoMod a
footer String
"'ks COMMAND --help' to get help on each command")

cliParser :: Parser CLI
cliParser :: Parser CLI
cliParser =
    CtxParams -> Command -> CLI
CLI
      (CtxParams -> Command -> CLI)
-> Parser CtxParams -> Parser (Command -> CLI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser CtxParams
paramsParser
      Parser (Command -> CLI) -> Parser Command -> Parser CLI
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Command
p_command

paramsParser :: Parser CtxParams
paramsParser :: Parser CtxParams
paramsParser =
    Maybe String -> Maybe Bool -> Maybe Bool -> CtxParams
CtxParams
      (Maybe String -> Maybe Bool -> Maybe Bool -> CtxParams)
-> Parser (Maybe String)
-> Parser (Maybe Bool -> Maybe Bool -> CtxParams)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String -> Parser (Maybe String)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser String
p_store
      Parser (Maybe Bool -> Maybe Bool -> CtxParams)
-> Parser (Maybe Bool) -> Parser (Maybe Bool -> CtxParams)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Bool -> Parser (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Bool
p_debug_flg    Parser Bool -> Parser Bool -> Parser Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Bool
p_no_debug_flg )
      Parser (Maybe Bool -> CtxParams)
-> Parser (Maybe Bool) -> Parser CtxParams
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Bool -> Parser (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Bool
p_readonly_flg Parser Bool -> Parser Bool -> Parser Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Bool
p_writeback_flg)

p_store :: Parser FilePath
p_store :: Parser String
p_store =
    Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
      (Mod OptionFields String -> Parser String)
-> Mod OptionFields String -> Parser String
forall a b. (a -> b) -> a -> b
$  String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"store"
      Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE"
      Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"the file containing the key store"

p_debug_flg :: Parser Bool
p_debug_flg :: Parser Bool
p_debug_flg =
    Bool -> Mod FlagFields Bool -> Parser Bool
forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
True
      (Mod FlagFields Bool -> Parser Bool)
-> Mod FlagFields Bool -> Parser Bool
forall a b. (a -> b) -> a -> b
$  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"debug"
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'd'
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help  String
"enable debug logging"

p_no_debug_flg :: Parser Bool
p_no_debug_flg :: Parser Bool
p_no_debug_flg =
    Bool -> Mod FlagFields Bool -> Parser Bool
forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
False
      (Mod FlagFields Bool -> Parser Bool)
-> Mod FlagFields Bool -> Parser Bool
forall a b. (a -> b) -> a -> b
$  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"no-debug"
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'q'
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help  String
"disable debug logging"

p_readonly_flg :: Parser Bool
p_readonly_flg :: Parser Bool
p_readonly_flg =
    Bool -> Mod FlagFields Bool -> Parser Bool
forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
True
      (Mod FlagFields Bool -> Parser Bool)
-> Mod FlagFields Bool -> Parser Bool
forall a b. (a -> b) -> a -> b
$  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"readonly"
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'r'
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help  String
"disable updating of keystore"

p_writeback_flg :: Parser Bool
p_writeback_flg :: Parser Bool
p_writeback_flg =
    Bool -> Mod FlagFields Bool -> Parser Bool
forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
False
      (Mod FlagFields Bool -> Parser Bool)
-> Mod FlagFields Bool -> Parser Bool
forall a b. (a -> b) -> a -> b
$  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"writeback"
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'w'
      Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help  String
"write back the keystore"

p_command :: Parser Command
p_command :: Parser Command
p_command =
    Mod CommandFields Command -> Parser Command
forall a. Mod CommandFields a -> Parser a
subparser
     (Mod CommandFields Command -> Parser Command)
-> Mod CommandFields Command -> Parser Command
forall a b. (a -> b) -> a -> b
$  String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"version"           ParserInfo Command
pi_version
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"keystore"          ParserInfo Command
pi_keystore
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"initialise"        ParserInfo Command
pi_initialise
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"update-settings"   ParserInfo Command
pi_update_settings
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list-settings"     ParserInfo Command
pi_list_settings
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list-setting-opts" ParserInfo Command
pi_list_setting_opts
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"add-trigger"       ParserInfo Command
pi_add_trigger
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"rmv-trigger"       ParserInfo Command
pi_rmv_trigger
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list-triggers"     ParserInfo Command
pi_list_triggers
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"create"            ParserInfo Command
pi_create
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"create-key-pair"   ParserInfo Command
pi_create_key_pair
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"secure"            ParserInfo Command
pi_secure
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list"              ParserInfo Command
pi_list
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"info"              ParserInfo Command
pi_info
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-identity"     ParserInfo Command
pi_show_identity
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-comment"      ParserInfo Command
pi_show_comment
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-date"         ParserInfo Command
pi_show_date
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-hash"         ParserInfo Command
pi_show_hash
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-hash-comment" ParserInfo Command
pi_show_hash_comment
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-hash-salt"    ParserInfo Command
pi_show_hash_salt
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-public"       ParserInfo Command
pi_show_public
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-secret"       ParserInfo Command
pi_show_secret
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"encrypt"           ParserInfo Command
pi_encrypt
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"decrypt"           ParserInfo Command
pi_decrypt
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"sign"              ParserInfo Command
pi_sign
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"verify"            ParserInfo Command
pi_verify
     Mod CommandFields Command
-> Mod CommandFields Command -> Mod CommandFields Command
forall a. Semigroup a => a -> a -> a
<> String -> ParserInfo Command -> Mod CommandFields Command
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"delete"            ParserInfo Command
pi_delete

pi_version
    , pi_keystore
    , pi_initialise
    , pi_update_settings
    , pi_list_settings
    , pi_list_setting_opts
    , pi_add_trigger
    , pi_rmv_trigger
    , pi_list_triggers
    , pi_create
    , pi_create_key_pair
    , pi_secure
    , pi_list
    , pi_info
    , pi_show_identity
    , pi_show_comment
    , pi_show_date
    , pi_show_hash
    , pi_show_hash_comment
    , pi_show_hash_salt
    , pi_show_public
    , pi_show_secret
    , pi_encrypt
    , pi_decrypt
    , pi_sign
    , pi_verify
    , pi_delete :: ParserInfo Command

pi_version :: ParserInfo Command
pi_version =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Command -> Parser Command
forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
Version)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"report the version of this package")

pi_keystore :: ParserInfo Command
pi_keystore =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Command -> Parser Command
forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
Keystore)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"list the details of the keystore")

pi_initialise :: ParserInfo Command
pi_initialise =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (String -> Command
Initialise
                (String -> Command) -> Parser String -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"FILE" String
"home of the new keystore"))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"initialise a new key store")

pi_update_settings :: ParserInfo Command
pi_update_settings =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (String -> Command
UpdateSettings
                (String -> Command) -> Parser String -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"JSON-SETTINGS-FILE"  String
"new settings"))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"update the keystore settings")

pi_list_settings :: ParserInfo Command
pi_list_settings =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (Command -> Parser Command
forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
ListSettings))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"dump the keystore settings on stdout")

pi_list_setting_opts :: ParserInfo Command
pi_list_setting_opts =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (Maybe OptEnum -> Command
ListSettingOpts
                (Maybe OptEnum -> Command)
-> Parser (Maybe OptEnum) -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser OptEnum -> Parser (Maybe OptEnum)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser OptEnum
p_opt))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"list the settings options")

pi_add_trigger :: ParserInfo Command
pi_add_trigger =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (TriggerID -> Pattern -> String -> Command
AddTrigger
                (TriggerID -> Pattern -> String -> Command)
-> Parser TriggerID -> Parser (Pattern -> String -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser TriggerID
p_trigger_id
                Parser (Pattern -> String -> Command)
-> Parser Pattern -> Parser (String -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Pattern
p_pattern
                Parser (String -> Command) -> Parser String -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"JSON-SETTINGS-FILE"  String
"conditional settings"))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"add trigger")

pi_rmv_trigger :: ParserInfo Command
pi_rmv_trigger =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (TriggerID -> Command
RmvTrigger
                (TriggerID -> Command) -> Parser TriggerID -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser TriggerID
p_trigger_id))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"remove trigger")

pi_list_triggers :: ParserInfo Command
pi_list_triggers =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (Command -> Parser Command
forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
ListTriggers))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"remove trigger")

pi_create :: ParserInfo Command
pi_create =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Parser (Command -> Command)
forall a. Parser (a -> a)
helper Parser (Command -> Command) -> Parser Command -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (Name
-> Comment
-> Identity
-> Maybe EnvVar
-> Maybe String
-> [Safeguard]
-> Command
Create
                (Name
 -> Comment
 -> Identity
 -> Maybe EnvVar
 -> Maybe String
 -> [Safeguard]
 -> Command)
-> Parser Name
-> Parser
     (Comment
      -> Identity
      -> Maybe EnvVar
      -> Maybe String
      -> [Safeguard]
      -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
                Parser
  (Comment
   -> Identity
   -> Maybe EnvVar
   -> Maybe String
   -> [Safeguard]
   -> Command)
-> Parser Comment
-> Parser
     (Identity
      -> Maybe EnvVar -> Maybe String -> [Safeguard] -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Comment
p_comment
                Parser
  (Identity
   -> Maybe EnvVar -> Maybe String -> [Safeguard] -> Command)
-> Parser Identity
-> Parser (Maybe EnvVar -> Maybe String -> [Safeguard] -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Identity
p_identity
                Parser (Maybe EnvVar -> Maybe String -> [Safeguard] -> Command)
-> Parser (Maybe EnvVar)
-> Parser (Maybe String -> [Safeguard] -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser EnvVar -> Parser (Maybe EnvVar)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser EnvVar
p_env_var
                Parser (Maybe String -> [Safeguard] -> Command)
-> Parser (Maybe String) -> Parser ([Safeguard] -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String -> Parser (Maybe String)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser String
p_key_text
                Parser ([Safeguard] -> Command)
-> Parser [Safeguard] -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Safeguard -> Parser [Safeguard]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Safeguard
p_safeguard))
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"create a key")

pi_create_key_pair :: ParserInfo Command
pi_create_key_pair =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> Comment -> Identity -> [Safeguard] -> Command
CreateKeyPair
            (Name -> Comment -> Identity -> [Safeguard] -> Command)
-> Parser Name
-> Parser (Comment -> Identity -> [Safeguard] -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            Parser (Comment -> Identity -> [Safeguard] -> Command)
-> Parser Comment -> Parser (Identity -> [Safeguard] -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Comment
p_comment
            Parser (Identity -> [Safeguard] -> Command)
-> Parser Identity -> Parser ([Safeguard] -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Identity
p_identity
            Parser ([Safeguard] -> Command)
-> Parser [Safeguard] -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Safeguard -> Parser [Safeguard]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Safeguard
p_safeguard)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"create an RSA key pair")

pi_secure :: ParserInfo Command
pi_secure =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> Maybe String -> [Safeguard] -> Command
Secure
            (Name -> Maybe String -> [Safeguard] -> Command)
-> Parser Name -> Parser (Maybe String -> [Safeguard] -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            Parser (Maybe String -> [Safeguard] -> Command)
-> Parser (Maybe String) -> Parser ([Safeguard] -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String -> Parser (Maybe String)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser String
p_key_text
            Parser ([Safeguard] -> Command)
-> Parser [Safeguard] -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Safeguard -> Parser [Safeguard]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Safeguard
p_safeguard)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"insert an encrypted copy of the named secret key")

pi_list :: ParserInfo Command
pi_list =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Command -> Parser Command
forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
List)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"list individual keys or all keys in the store")

pi_info :: ParserInfo Command
pi_info =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        ([Name] -> Command
Info
            ([Name] -> Command) -> Parser [Name] -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name -> Parser [Name]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"list individual keys or all keys in the store")

pi_show_identity :: ParserInfo Command
pi_show_identity =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowIdentity
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_comment :: ParserInfo Command
pi_show_comment =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowComment
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_date :: ParserInfo Command
pi_show_date =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowDate
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_hash :: ParserInfo Command
pi_show_hash =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowHash
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_hash_comment :: ParserInfo Command
pi_show_hash_comment =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowHashComment
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_hash_salt :: ParserInfo Command
pi_show_hash_salt =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowHashSalt
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_public :: ParserInfo Command
pi_show_public =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowPublic
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the public key (DER format)")

pi_show_secret :: ParserInfo Command
pi_show_secret =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowSecret
            (Bool -> Name -> Command)
-> Parser Bool -> Parser (Name -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            Parser (Name -> Command) -> Parser Name -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"show the secret text")

pi_encrypt :: ParserInfo Command
pi_encrypt =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> String -> String -> Command
Encrypt
            (Name -> String -> String -> Command)
-> Parser Name -> Parser (String -> String -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            Parser (String -> String -> Command)
-> Parser String -> Parser (String -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"INPUT-FILE"  String
"file to encrypt"
            Parser (String -> Command) -> Parser String -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"OUTPUT-FILE" String
"encrypted file")
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"encrypt a file with a named public key")

pi_decrypt :: ParserInfo Command
pi_decrypt =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (String -> String -> Command
Decrypt
            (String -> String -> Command)
-> Parser String -> Parser (String -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"INPUT-FILE"  String
"file to decrypt"
            Parser (String -> Command) -> Parser String -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"OUTPUT-FILE" String
"decrypted file")
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"decrypt a file with the private key")

pi_sign :: ParserInfo Command
pi_sign =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> String -> String -> Command
Sign
            (Name -> String -> String -> Command)
-> Parser Name -> Parser (String -> String -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            Parser (String -> String -> Command)
-> Parser String -> Parser (String -> Command)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"INPUT-FILE"  String
"file to sign"
            Parser (String -> Command) -> Parser String -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"OUTPUT-FILE" String
"file to place the signature")
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"sign a file with a named private key")

pi_verify :: ParserInfo Command
pi_verify =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (String -> String -> Command
Verify
            (String -> String -> Command)
-> Parser String -> Parser (String -> Command)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"INPUT-FILE"     String
"file that was signed"
            Parser (String -> Command) -> Parser String -> Parser Command
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"SIGNATURE-FILE" String
"signature to verify")
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"verify a file with the public key")

pi_delete :: ParserInfo Command
pi_delete =
    Parser Command -> InfoMod Command -> ParserInfo Command
forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        ([Name] -> Command
Delete
            ([Name] -> Command) -> Parser [Name] -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name -> Parser [Name]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Name
p_name)
        (String -> InfoMod Command
forall a. String -> InfoMod a
progDesc String
"delete one or more (unused) keys")

p_trigger_id  :: Parser TriggerID
p_trigger_id :: Parser TriggerID
p_trigger_id =
    ReadM TriggerID -> Mod ArgumentFields TriggerID -> Parser TriggerID
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ((String -> Either String TriggerID) -> ReadM TriggerID
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String TriggerID) -> ReadM TriggerID)
-> (String -> Either String TriggerID) -> ReadM TriggerID
forall a b. (a -> b) -> a -> b
$ TriggerID -> Either String TriggerID
forall a b. b -> Either a b
Right (TriggerID -> Either String TriggerID)
-> (String -> TriggerID) -> String -> Either String TriggerID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> TriggerID
TriggerID (Text -> TriggerID) -> (String -> Text) -> String -> TriggerID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        (Mod ArgumentFields TriggerID -> Parser TriggerID)
-> Mod ArgumentFields TriggerID -> Parser TriggerID
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields TriggerID
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TRIGGER"
        Mod ArgumentFields TriggerID
-> Mod ArgumentFields TriggerID -> Mod ArgumentFields TriggerID
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields TriggerID
forall (f :: * -> *) a. String -> Mod f a
help    String
"name of the triggered settings"

p_pattern :: Parser Pattern
p_pattern :: Parser Pattern
p_pattern =
    ReadM Pattern -> Mod ArgumentFields Pattern -> Parser Pattern
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ((String -> Either String Pattern) -> ReadM Pattern
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String Pattern) -> ReadM Pattern)
-> (String -> Either String Pattern) -> ReadM Pattern
forall a b. (a -> b) -> a -> b
$ Pattern -> Either String Pattern
forall a b. b -> Either a b
Right (Pattern -> Either String Pattern)
-> (String -> Pattern) -> String -> Either String Pattern
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Pattern
mk)
        (Mod ArgumentFields Pattern -> Parser Pattern)
-> Mod ArgumentFields Pattern -> Parser Pattern
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields Pattern
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"REGEX"
        Mod ArgumentFields Pattern
-> Mod ArgumentFields Pattern -> Mod ArgumentFields Pattern
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields Pattern
forall (f :: * -> *) a. String -> Mod f a
help    String
"POSIX regular expression for selecting matching keys"
  where
    mk :: String -> Pattern
mk String
s = String -> Regex -> Pattern
Pattern String
s (Regex -> Pattern) -> Regex -> Pattern
forall a b. (a -> b) -> a -> b
$ String -> Regex
mkRegex String
s

p_name :: Parser Name
p_name :: Parser Name
p_name =
    ReadM Name -> Mod ArgumentFields Name -> Parser Name
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ((String -> Either String Name) -> ReadM Name
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String Name) -> ReadM Name)
-> (String -> Either String Name) -> ReadM Name
forall a b. (a -> b) -> a -> b
$ (Reason -> Either String Name)
-> (Name -> Either String Name)
-> Either Reason Name
-> Either String Name
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Either String Name
forall a b. a -> Either a b
Left (String -> Either String Name)
-> (Reason -> String) -> Reason -> Either String Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reason -> String
showReason) Name -> Either String Name
forall a b. b -> Either a b
Right (Either Reason Name -> Either String Name)
-> (String -> Either Reason Name) -> String -> Either String Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either Reason Name
name)
        (Mod ArgumentFields Name -> Parser Name)
-> Mod ArgumentFields Name -> Parser Name
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields Name
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"NAME"
        Mod ArgumentFields Name
-> Mod ArgumentFields Name -> Mod ArgumentFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields Name
forall (f :: * -> *) a. String -> Mod f a
help    String
"name of the key"

p_comment :: Parser Comment
p_comment :: Parser Comment
p_comment =
    ReadM Comment -> Mod ArgumentFields Comment -> Parser Comment
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ((String -> Either String Comment) -> ReadM Comment
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String Comment) -> ReadM Comment)
-> (String -> Either String Comment) -> ReadM Comment
forall a b. (a -> b) -> a -> b
$ Comment -> Either String Comment
forall a b. b -> Either a b
Right (Comment -> Either String Comment)
-> (String -> Comment) -> String -> Either String Comment
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Comment
Comment (Text -> Comment) -> (String -> Text) -> String -> Comment
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        (Mod ArgumentFields Comment -> Parser Comment)
-> Mod ArgumentFields Comment -> Parser Comment
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields Comment
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"COMMENT"
        Mod ArgumentFields Comment
-> Mod ArgumentFields Comment -> Mod ArgumentFields Comment
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields Comment
forall (f :: * -> *) a. String -> Mod f a
help    String
"comment text"

p_identity :: Parser Identity
p_identity :: Parser Identity
p_identity = (Maybe Identity -> Identity)
-> Parser (Maybe Identity) -> Parser Identity
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Identity -> (Identity -> Identity) -> Maybe Identity -> Identity
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Identity
"" Identity -> Identity
forall a. a -> a
id) (Parser (Maybe Identity) -> Parser Identity)
-> Parser (Maybe Identity) -> Parser Identity
forall a b. (a -> b) -> a -> b
$ Parser Identity -> Parser (Maybe Identity)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Identity -> Parser (Maybe Identity))
-> Parser Identity -> Parser (Maybe Identity)
forall a b. (a -> b) -> a -> b
$
    ReadM Identity -> Mod ArgumentFields Identity -> Parser Identity
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ((String -> Either String Identity) -> ReadM Identity
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String Identity) -> ReadM Identity)
-> (String -> Either String Identity) -> ReadM Identity
forall a b. (a -> b) -> a -> b
$ Identity -> Either String Identity
forall a b. b -> Either a b
Right (Identity -> Either String Identity)
-> (String -> Identity) -> String -> Either String Identity
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Identity
Identity (Text -> Identity) -> (String -> Text) -> String -> Identity
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        (Mod ArgumentFields Identity -> Parser Identity)
-> Mod ArgumentFields Identity -> Parser Identity
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields Identity
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"KEY-IDENTITY"
        Mod ArgumentFields Identity
-> Mod ArgumentFields Identity -> Mod ArgumentFields Identity
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields Identity
forall (f :: * -> *) a. String -> Mod f a
help    String
"identity of the key"

p_env_var :: Parser EnvVar
p_env_var :: Parser EnvVar
p_env_var =
    ReadM EnvVar -> Mod ArgumentFields EnvVar -> Parser EnvVar
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ((String -> Either String EnvVar) -> ReadM EnvVar
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String EnvVar) -> ReadM EnvVar)
-> (String -> Either String EnvVar) -> ReadM EnvVar
forall a b. (a -> b) -> a -> b
$ EnvVar -> Either String EnvVar
forall a b. b -> Either a b
Right (EnvVar -> Either String EnvVar)
-> (String -> EnvVar) -> String -> Either String EnvVar
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> EnvVar
forall a. IsString a => String -> a
fromString)
        (Mod ArgumentFields EnvVar -> Parser EnvVar)
-> Mod ArgumentFields EnvVar -> Parser EnvVar
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields EnvVar
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"ENV-VAR"
        Mod ArgumentFields EnvVar
-> Mod ArgumentFields EnvVar -> Mod ArgumentFields EnvVar
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields EnvVar
forall (f :: * -> *) a. String -> Mod f a
help    String
"environment variable to hold the key's value"

p_safeguard :: Parser Safeguard
p_safeguard :: Parser Safeguard
p_safeguard =
    ReadM Safeguard -> Mod OptionFields Safeguard -> Parser Safeguard
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ((String -> Either String Safeguard) -> ReadM Safeguard
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String Safeguard) -> ReadM Safeguard)
-> (String -> Either String Safeguard) -> ReadM Safeguard
forall a b. (a -> b) -> a -> b
$ (Reason -> Either String Safeguard)
-> (Safeguard -> Either String Safeguard)
-> Either Reason Safeguard
-> Either String Safeguard
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Either String Safeguard
forall a b. a -> Either a b
Left (String -> Either String Safeguard)
-> (Reason -> String) -> Reason -> Either String Safeguard
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reason -> String
showReason) Safeguard -> Either String Safeguard
forall a b. b -> Either a b
Right (Either Reason Safeguard -> Either String Safeguard)
-> (String -> Either Reason Safeguard)
-> String
-> Either String Safeguard
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either Reason Safeguard
parseSafeguard)
        (Mod OptionFields Safeguard -> Parser Safeguard)
-> Mod OptionFields Safeguard -> Parser Safeguard
forall a b. (a -> b) -> a -> b
$  String -> Mod OptionFields Safeguard
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"safeguard"
        Mod OptionFields Safeguard
-> Mod OptionFields Safeguard -> Mod OptionFields Safeguard
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Safeguard
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"SAFEGUARD"
        Mod OptionFields Safeguard
-> Mod OptionFields Safeguard -> Mod OptionFields Safeguard
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Safeguard
forall (f :: * -> *) a. String -> Mod f a
help String
"keys used to encrypt the secret key"

p_key_text :: Parser FilePath
p_key_text :: Parser String
p_key_text =
    Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        (Mod OptionFields String -> Parser String)
-> Mod OptionFields String -> Parser String
forall a b. (a -> b) -> a -> b
$  String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long    String
"key-file"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help    String
"secret key file"

p_file :: String -> String -> Parser FilePath
p_file :: String -> String -> Parser String
p_file String
mtv String
hlp =
    ReadM String -> Mod ArgumentFields String -> Parser String
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ReadM String
forall s. IsString s => ReadM s
str
        (Mod ArgumentFields String -> Parser String)
-> Mod ArgumentFields String -> Parser String
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
mtv
        Mod ArgumentFields String
-> Mod ArgumentFields String -> Mod ArgumentFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields String
forall (f :: * -> *) a. String -> Mod f a
help    String
hlp

p_armour :: Parser Bool
p_armour :: Parser Bool
p_armour =
    Mod FlagFields Bool -> Parser Bool
switch
        (Mod FlagFields Bool -> Parser Bool)
-> Mod FlagFields Bool -> Parser Bool
forall a b. (a -> b) -> a -> b
$ String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"base-64"
        Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"base-64 encode the result"

p_opt :: Parser OptEnum
p_opt :: Parser OptEnum
p_opt =
    ReadM OptEnum -> Mod ArgumentFields OptEnum -> Parser OptEnum
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ((String -> Either String OptEnum) -> ReadM OptEnum
forall a. (String -> Either String a) -> ReadM a
eitherReader ((String -> Either String OptEnum) -> ReadM OptEnum)
-> (String -> Either String OptEnum) -> ReadM OptEnum
forall a b. (a -> b) -> a -> b
$ Either String OptEnum
-> (OptEnum -> Either String OptEnum)
-> Maybe OptEnum
-> Either String OptEnum
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Either String OptEnum
forall a b. a -> Either a b
Left String
"bad SETTING-OPT") OptEnum -> Either String OptEnum
forall a b. b -> Either a b
Right (Maybe OptEnum -> Either String OptEnum)
-> (String -> Maybe OptEnum) -> String -> Either String OptEnum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe OptEnum
parseOpt (Text -> Maybe OptEnum)
-> (String -> Text) -> String -> Maybe OptEnum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        (Mod ArgumentFields OptEnum -> Parser OptEnum)
-> Mod ArgumentFields OptEnum -> Parser OptEnum
forall a b. (a -> b) -> a -> b
$  String -> Mod ArgumentFields OptEnum
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"SETTING-OPT"
        Mod ArgumentFields OptEnum
-> Mod ArgumentFields OptEnum -> Mod ArgumentFields OptEnum
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields OptEnum
forall (f :: * -> *) a. String -> Mod f a
help    String
"name of a keystore setting option"

h_info :: Parser a -> InfoMod a -> ParserInfo a
h_info :: Parser a -> InfoMod a -> ParserInfo a
h_info Parser a
pr = Parser a -> InfoMod a -> ParserInfo a
forall a. Parser a -> InfoMod a -> ParserInfo a
info (Parser (a -> a)
forall a. Parser (a -> a)
helper Parser (a -> a) -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
pr)

runParse :: ParserInfo a -> [String] -> IO a
runParse :: ParserInfo a -> [String] -> IO a
runParse ParserInfo a
pinfo [String]
args =
  case ParserPrefs -> ParserInfo a -> [String] -> ParserResult a
forall a. ParserPrefs -> ParserInfo a -> [String] -> ParserResult a
execParserPure (PrefsMod -> ParserPrefs
prefs PrefsMod
forall m. Monoid m => m
idm) ParserInfo a
pinfo [String]
args of
    Success a
a -> a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
    Failure ParserFailure ParserHelp
failure -> do
      String
progn <- IO String
getProgName
      let (ParserHelp
msg, ExitCode
exit, Int
_) = ParserFailure ParserHelp -> String -> (ParserHelp, ExitCode, Int)
forall h. ParserFailure h -> String -> (h, ExitCode, Int)
execFailure ParserFailure ParserHelp
failure String
progn
      case ExitCode
exit of
        ExitCode
ExitSuccess -> String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ ParserHelp -> String
forall a. Show a => a -> String
show ParserHelp
msg
        ExitCode
_           -> Handle -> String -> IO ()
hPutStrLn Handle
stderr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ ParserHelp -> String
forall a. Show a => a -> String
show ParserHelp
msg
      ExitCode -> IO a
forall a. ExitCode -> IO a
exitWith ExitCode
exit
    CompletionInvoked CompletionResult
compl -> do
      String
progn <- IO String
getProgName
      String
msg   <- CompletionResult -> String -> IO String
execCompletion CompletionResult
compl String
progn
      String -> IO ()
putStr String
msg
      ExitCode -> IO a
forall a. ExitCode -> IO a
exitWith ExitCode
ExitSuccess