2018-03-30 00:35:12 +02:00
|
|
|
{-# LANGUAGE MultiWayIf #-}
|
2018-03-30 10:50:19 +02:00
|
|
|
{-# LANGUAGE TupleSections #-}
|
2018-03-30 00:35:12 +02:00
|
|
|
|
2015-06-23 23:53:07 +02:00
|
|
|
module Main where
|
|
|
|
|
2018-03-30 10:11:27 +02:00
|
|
|
import Control.Monad
|
|
|
|
import Nix.Builtins
|
|
|
|
import Nix.Parser
|
|
|
|
import Nix.Pretty
|
2018-03-30 21:47:49 +02:00
|
|
|
import Nix.Lint
|
2018-03-30 10:11:27 +02:00
|
|
|
import Options.Applicative hiding (ParserResult(..))
|
2018-03-30 10:50:19 +02:00
|
|
|
import System.FilePath
|
2018-03-30 10:11:27 +02:00
|
|
|
import System.IO
|
|
|
|
import Text.PrettyPrint.ANSI.Leijen hiding ((<$>))
|
2015-06-23 23:53:07 +02:00
|
|
|
|
2018-03-28 06:59:27 +02:00
|
|
|
data Options = Options
|
|
|
|
{ verbose :: Bool
|
|
|
|
, debug :: Bool
|
|
|
|
, evaluate :: Bool
|
2018-03-29 01:27:35 +02:00
|
|
|
, check :: Bool
|
2018-03-28 06:59:27 +02:00
|
|
|
, filePath :: Maybe FilePath
|
|
|
|
, expression :: Maybe String
|
|
|
|
}
|
2015-06-23 23:53:07 +02:00
|
|
|
|
2018-03-28 06:59:27 +02:00
|
|
|
mainOptions :: Parser Options
|
|
|
|
mainOptions = Options
|
|
|
|
<$> switch
|
|
|
|
( short 'v'
|
|
|
|
<> long "verbose"
|
|
|
|
<> help "Verbose output")
|
|
|
|
<*> switch
|
|
|
|
( short 'd'
|
|
|
|
<> long "debug"
|
|
|
|
<> help "Debug output")
|
|
|
|
<*> switch
|
|
|
|
( long "eval"
|
|
|
|
<> help "Whether to evaluate, or just pretty-print")
|
2018-03-29 01:27:35 +02:00
|
|
|
<*> switch
|
|
|
|
( long "check"
|
|
|
|
<> help "Whether to check for syntax errors after parsing")
|
2018-03-28 06:59:27 +02:00
|
|
|
<*> optional (strOption
|
|
|
|
( short 'f'
|
|
|
|
<> long "file"
|
|
|
|
<> help "File to parse or evaluate"))
|
|
|
|
<*> optional (strOption
|
|
|
|
( short 'e'
|
|
|
|
<> long "expr"
|
|
|
|
<> help "Expression to parse or evaluate"))
|
2015-06-24 02:18:43 +02:00
|
|
|
|
2015-06-23 23:53:07 +02:00
|
|
|
main :: IO ()
|
|
|
|
main = do
|
2018-03-28 06:59:27 +02:00
|
|
|
opts <- execParser optsDef
|
2018-03-30 10:50:19 +02:00
|
|
|
(eres, mdir) <- case expression opts of
|
|
|
|
Just s -> return (parseNixString s, Nothing)
|
2018-03-28 06:59:27 +02:00
|
|
|
Nothing -> case filePath opts of
|
2018-03-30 10:50:19 +02:00
|
|
|
Nothing -> (, Nothing) . parseNixString <$> getContents
|
|
|
|
Just "-" -> (, Nothing) . parseNixString <$> getContents
|
|
|
|
Just path -> (, Just (takeDirectory path)) <$> parseNixFile path
|
2018-03-28 06:59:27 +02:00
|
|
|
|
|
|
|
case eres of
|
|
|
|
Failure err -> hPutStrLn stderr $ "Parse failed: " ++ show err
|
2018-03-29 01:27:35 +02:00
|
|
|
Success expr -> do
|
2018-03-30 10:11:27 +02:00
|
|
|
when (check opts) $ lintExpr expr
|
|
|
|
if | evaluate opts, debug opts ->
|
2018-03-30 10:50:19 +02:00
|
|
|
print =<< tracingEvalTopLevelExprIO mdir expr
|
2018-03-30 00:35:12 +02:00
|
|
|
| evaluate opts ->
|
2018-03-30 10:50:19 +02:00
|
|
|
putStrLn . printNix =<< evalTopLevelExprIO mdir expr
|
2018-03-30 00:35:12 +02:00
|
|
|
| debug opts ->
|
|
|
|
print expr
|
|
|
|
| otherwise ->
|
|
|
|
displayIO stdout $ renderPretty 0.4 80 (prettyNix expr)
|
2018-03-28 06:59:27 +02:00
|
|
|
where
|
|
|
|
optsDef :: ParserInfo Options
|
|
|
|
optsDef = info (helper <*> mainOptions)
|
|
|
|
(fullDesc <> progDesc "" <> header "hnix")
|