{-# LANGUAGE TemplateHaskell #-}

-- | Code that configures presentation parser for the CLI options
module Nix.Options.Parser where

import           Relude.Unsafe                  ( read )
import           GHC.Err                        ( errorWithoutStackTrace )
import           Data.Char                      ( isDigit )
import qualified Data.Text                     as Text
import           Data.Time                      ( UTCTime
                                                , defaultTimeLocale
                                                , parseTimeOrError
                                                )
import           Nix.Options
import           Options.Applicative     hiding ( ParserResult(..) )
import           Data.Version                   ( showVersion )
import           Development.GitRev             ( gitCommitDate
                                                , gitBranch
                                                , gitHash )
import           Paths_hnix                     ( version )

decodeVerbosity :: Int -> Verbosity
decodeVerbosity :: Int -> Verbosity
decodeVerbosity Int
0 = Verbosity
ErrorsOnly
decodeVerbosity Int
1 = Verbosity
Informational
decodeVerbosity Int
2 = Verbosity
Talkative
decodeVerbosity Int
3 = Verbosity
Chatty
decodeVerbosity Int
4 = Verbosity
DebugInfo
decodeVerbosity Int
_ = Verbosity
Vomit

argPair :: Mod OptionFields (Text, Text) -> Parser (Text, Text)
argPair :: Mod OptionFields (Text, Text) -> Parser (Text, Text)
argPair =
  ReadM (Text, Text)
-> Mod OptionFields (Text, Text) -> Parser (Text, Text)
forall a. ReadM a -> Mod OptionFields a -> Parser a
option (ReadM (Text, Text)
 -> Mod OptionFields (Text, Text) -> Parser (Text, Text))
-> ReadM (Text, Text)
-> Mod OptionFields (Text, Text)
-> Parser (Text, Text)
forall a b. (a -> b) -> a -> b
$
    do
      Text
s <- ReadM Text
forall s. IsString s => ReadM s
str
      ReadM (Text, Text)
-> (Int -> ReadM (Text, Text)) -> Maybe Int -> ReadM (Text, Text)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
        (String -> ReadM (Text, Text)
forall a. String -> a
errorWithoutStackTrace String
"Format of --arg/--argstr in hnix is: name=expr")
        ((Text, Text) -> ReadM (Text, Text)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Text, Text) -> ReadM (Text, Text))
-> (Int -> (Text, Text)) -> Int -> ReadM (Text, Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> Text) -> (Text, Text) -> (Text, Text)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second Text -> Text
Text.tail ((Text, Text) -> (Text, Text))
-> (Int -> (Text, Text)) -> Int -> (Text, Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Text -> (Text, Text)
`Text.splitAt` Text
s))
        ((Char -> Bool) -> Text -> Maybe Int
Text.findIndex (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'=') Text
s)

nixOptions :: UTCTime -> Parser Options
nixOptions :: UTCTime -> Parser Options
nixOptions UTCTime
current =
  Verbosity
-> Bool
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Bool
-> Bool
-> Bool
-> Bool
-> Maybe Text
-> [String]
-> Bool
-> Maybe String
-> Bool
-> Bool
-> Bool
-> Maybe Text
-> [(Text, Text)]
-> [(Text, Text)]
-> Maybe String
-> UTCTime
-> [String]
-> Options
Options (Verbosity
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> Maybe String
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> Maybe String
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> Maybe Text
 -> [String]
 -> Bool
 -> Maybe String
 -> Bool
 -> Bool
 -> Bool
 -> Maybe Text
 -> [(Text, Text)]
 -> [(Text, Text)]
 -> Maybe String
 -> UTCTime
 -> [String]
 -> Options)
-> Parser Verbosity
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
    (Verbosity -> Maybe Verbosity -> Verbosity
forall a. a -> Maybe a -> a
fromMaybe Verbosity
Informational (Maybe Verbosity -> Verbosity)
-> Parser (Maybe Verbosity) -> Parser Verbosity
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
      Parser Verbosity -> Parser (Maybe Verbosity)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
        (ReadM Verbosity -> Mod OptionFields Verbosity -> Parser Verbosity
forall a. ReadM a -> Mod OptionFields a -> Parser a
option

          (do
            String
a <- ReadM String
forall s. IsString s => ReadM s
str
            ReadM Verbosity -> ReadM Verbosity -> Bool -> ReadM Verbosity
forall a. a -> a -> Bool -> a
bool
              (String -> ReadM Verbosity
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Argument to -v/--verbose must be a number")
              (Verbosity -> ReadM Verbosity
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Verbosity -> ReadM Verbosity) -> Verbosity -> ReadM Verbosity
forall a b. (a -> b) -> a -> b
$ Int -> Verbosity
decodeVerbosity (Int -> Verbosity) -> Int -> Verbosity
forall a b. (a -> b) -> a -> b
$ String -> Int
forall a. Read a => String -> a
read String
a)
              ((Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isDigit String
a)
          )

          (  Char -> Mod OptionFields Verbosity
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'v'
          Mod OptionFields Verbosity
-> Mod OptionFields Verbosity -> Mod OptionFields Verbosity
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Verbosity
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"verbose"
          Mod OptionFields Verbosity
-> Mod OptionFields Verbosity -> Mod OptionFields Verbosity
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Verbosity
forall (f :: * -> *) a. String -> Mod f a
help String
"Verbose output"
          )

        )
      )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"trace"
        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 tracing code (even more can be seen if built with --flags=tracing)"
        )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"thunks"
        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 reporting of thunk tracing as well as regular evaluation"
        )
    Parser
  (Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"values"
        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 reporting of value provenance in error messages"
        )
    Parser
  (Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"scopes"
        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 reporting of scopes in evaluation traces"
        )
    Parser
  (Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser (Maybe String)
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
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
        (Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"reduce"
          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
"When done evaluating, output the evaluated part of the expression to FILE"
          )
        )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"reduce-sets"
        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
"Reduce set members that aren't used; breaks if hasAttr is used"
        )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"reduce-lists"
        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
"Reduce list members that aren't used; breaks if elemAt is used"
        )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"parse"
        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
"Whether to parse the file (also the default right now)"
        )
    Parser
  (Bool
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"parse-only"
        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
"Whether to parse only, no pretty printing or checking"
        )
    Parser
  (Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"find"
        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
"If selected, find paths within attr trees"
        )
    Parser
  (Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser (Maybe String)
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
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
        (Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"find-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
"Look up the given files in Nix's search path"
          )
        )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"strict"
        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
"When used with --eval, recursively evaluate list elements and attributes"
        )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"eval"
        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
"Whether to evaluate, or just pretty-print"
        )
    Parser
  (Bool
   -> Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"json"
        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
"Print the resulting value as an JSON representation"
        )
    Parser
  (Bool
   -> Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Maybe Text
      -> [String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"xml"
        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
"Print the resulting value as an XML representation"
        )
    Parser
  (Maybe Text
   -> [String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser (Maybe Text)
-> Parser
     ([String]
      -> Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text -> Parser (Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
        (Mod OptionFields Text -> Parser Text
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  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
<> String -> Mod OptionFields Text
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"attr"
          Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Text
forall (f :: * -> *) a. String -> Mod f a
help String
"Select an attribute from the top-level Nix expression being evaluated"
          )
        )
    Parser
  ([String]
   -> Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser [String]
-> Parser
     (Bool
      -> Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String -> Parser [String]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many
        (Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  Char -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'I'
          Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"include"
          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
"Add a path to the Nix expression search path"
          )
        )
    Parser
  (Bool
   -> Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Maybe String
      -> Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"check"
        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
"Whether to check for syntax fails after parsing"
        )
    Parser
  (Maybe String
   -> Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser (Maybe String)
-> Parser
     (Bool
      -> Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
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
        (Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"read"
          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
"Read in an expression tree from a binary cache"
          )
        )
    Parser
  (Bool
   -> Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"cache"
        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 out the parsed expression tree to a binary cache"
        )
    Parser
  (Bool
   -> Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Bool
      -> Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"repl"
        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
"After performing any indicated actions, enter the REPL"
        )
    Parser
  (Bool
   -> Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser Bool
-> Parser
     (Maybe Text
      -> [(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (  String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ignore-fails"
        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
"Continue parsing files, even if there are fails"
        )
    Parser
  (Maybe Text
   -> [(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser (Maybe Text)
-> Parser
     ([(Text, Text)]
      -> [(Text, Text)]
      -> Maybe String
      -> UTCTime
      -> [String]
      -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text -> Parser (Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
        (Mod OptionFields Text -> Parser Text
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  Char -> Mod OptionFields Text
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'E'
          Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Text
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"expr"
          Mod OptionFields Text
-> Mod OptionFields Text -> Mod OptionFields Text
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Text
forall (f :: * -> *) a. String -> Mod f a
help String
"Expression to parse or evaluate")
        )
    Parser
  ([(Text, Text)]
   -> [(Text, Text)]
   -> Maybe String
   -> UTCTime
   -> [String]
   -> Options)
-> Parser [(Text, Text)]
-> Parser
     ([(Text, Text)] -> Maybe String -> UTCTime -> [String] -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Text, Text) -> Parser [(Text, Text)]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many
        (Mod OptionFields (Text, Text) -> Parser (Text, Text)
argPair
          (  String -> Mod OptionFields (Text, Text)
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"arg"
          Mod OptionFields (Text, Text)
-> Mod OptionFields (Text, Text) -> Mod OptionFields (Text, Text)
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields (Text, Text)
forall (f :: * -> *) a. String -> Mod f a
help String
"Argument to pass to an evaluated lambda")
        )
    Parser
  ([(Text, Text)] -> Maybe String -> UTCTime -> [String] -> Options)
-> Parser [(Text, Text)]
-> Parser (Maybe String -> UTCTime -> [String] -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Text, Text) -> Parser [(Text, Text)]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many
        (Mod OptionFields (Text, Text) -> Parser (Text, Text)
argPair
          (  String -> Mod OptionFields (Text, Text)
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"argstr"
          Mod OptionFields (Text, Text)
-> Mod OptionFields (Text, Text) -> Mod OptionFields (Text, Text)
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields (Text, Text)
forall (f :: * -> *) a. String -> Mod f a
help String
"Argument string to pass to an evaluated lambda"
          )
        )
    Parser (Maybe String -> UTCTime -> [String] -> Options)
-> Parser (Maybe String) -> Parser (UTCTime -> [String] -> Options)
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
        (Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  Char -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'f'
          Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long 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
"Parse all of the files given in FILE; - means stdin"
          )
        )
    Parser (UTCTime -> [String] -> Options)
-> Parser UTCTime -> Parser ([String] -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadM UTCTime -> Mod OptionFields UTCTime -> Parser UTCTime
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
        (Bool -> TimeLocale -> String -> String -> UTCTime
forall t.
ParseTime t =>
Bool -> TimeLocale -> String -> String -> t
parseTimeOrError Bool
True TimeLocale
defaultTimeLocale String
"%Y/%m/%d %H:%M:%S" (String -> UTCTime) -> ReadM String -> ReadM UTCTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadM String
forall s. IsString s => ReadM s
str)
        (  String -> Mod OptionFields UTCTime
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"now"
        Mod OptionFields UTCTime
-> Mod OptionFields UTCTime -> Mod OptionFields UTCTime
forall a. Semigroup a => a -> a -> a
<> UTCTime -> Mod OptionFields UTCTime
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value UTCTime
current
        Mod OptionFields UTCTime
-> Mod OptionFields UTCTime -> Mod OptionFields UTCTime
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields UTCTime
forall (f :: * -> *) a. String -> Mod f a
help String
"Set current time for testing purposes"
        )
    Parser ([String] -> Options) -> Parser [String] -> Parser Options
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String -> Parser [String]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many
        (Mod ArgumentFields String -> Parser String
forall s. IsString s => Mod ArgumentFields s -> Parser s
strArgument
          (  String -> Mod ArgumentFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE"
          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
"Path of file to parse"
          )
        )

--  2020-09-12: CLI --version option mechanism is tied to meta modules specificly generated by Cabal. It is possible to use Template Haskell to resolve the version, as also a g
versionOpt :: Parser (a -> a)
versionOpt :: forall a. Parser (a -> a)
versionOpt = Parser ((a -> a) -> a -> a)
forall a. Parser (a -> a)
shortVersionOpt Parser ((a -> a) -> a -> a) -> Parser (a -> a) -> Parser (a -> a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (a -> a)
forall a. Parser (a -> a)
debugVersionOpt
 where
  shortVersionOpt :: Parser (a -> a)
  shortVersionOpt :: forall a. Parser (a -> a)
shortVersionOpt =
    String -> Mod OptionFields (a -> a) -> Parser (a -> a)
forall a. String -> Mod OptionFields (a -> a) -> Parser (a -> a)
infoOption
      (Version -> String
showVersion Version
version)
      (  String -> Mod OptionFields (a -> a)
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"version"
      Mod OptionFields (a -> a)
-> Mod OptionFields (a -> a) -> Mod OptionFields (a -> a)
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields (a -> a)
forall (f :: * -> *) a. String -> Mod f a
help String
"Show release version"
      )

  --  2020-09-13: NOTE: Does not work for direct `nix-build`s, works for `nix-shell` `cabal` builds.
  debugVersionOpt :: Parser (a -> a)
  debugVersionOpt :: forall a. Parser (a -> a)
debugVersionOpt =
    String -> Mod OptionFields (a -> a) -> Parser (a -> a)
forall a. String -> Mod OptionFields (a -> a) -> Parser (a -> a)
infoOption
      ( [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
          [ String
"Version: ", Version -> String
showVersion Version
version
          , String
"\nCommit: ", $(gitHash)
          , String
"\n  date: ", $(gitCommitDate)
          , String
"\n  branch: ", $(gitBranch)
          ]
      )
      (  String -> Mod OptionFields (a -> a)
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"long-version"
      Mod OptionFields (a -> a)
-> Mod OptionFields (a -> a) -> Mod OptionFields (a -> a)
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields (a -> a)
forall (f :: * -> *) a. String -> Mod f a
help String
"Show long debug version form"
      )

nixOptionsInfo :: UTCTime -> ParserInfo Options
nixOptionsInfo :: UTCTime -> ParserInfo Options
nixOptionsInfo UTCTime
current =
  Parser Options -> InfoMod Options -> ParserInfo Options
forall a. Parser a -> InfoMod a -> ParserInfo a
info
    (Parser ((Options -> Options) -> Options -> Options)
forall a. Parser (a -> a)
helper Parser ((Options -> Options) -> Options -> Options)
-> Parser (Options -> Options) -> Parser (Options -> Options)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Options -> Options)
forall a. Parser (a -> a)
versionOpt Parser (Options -> Options) -> Parser Options -> Parser Options
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> UTCTime -> Parser Options
nixOptions UTCTime
current)
    (InfoMod Options
forall a. InfoMod a
fullDesc InfoMod Options -> InfoMod Options -> InfoMod Options
forall a. Semigroup a => a -> a -> a
<> String -> InfoMod Options
forall a. String -> InfoMod a
progDesc String
"" InfoMod Options -> InfoMod Options -> InfoMod Options
forall a. Semigroup a => a -> a -> a
<> String -> InfoMod Options
forall a. String -> InfoMod a
header String
"hnix")