dhall-haskell/dhall-nix/exec/Main.hs

72 lines
2.1 KiB
Haskell

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Control.Exception (SomeException)
import Options.Generic (Generic, ParseRecord, type (<?>)(..))
import System.Exit (ExitCode(..))
import qualified Control.Exception
import qualified Data.Text.IO
import qualified Data.Version
import qualified Dhall
import qualified Dhall.Import
import qualified Dhall.Nix
import qualified Dhall.Parser
import qualified Dhall.TypeCheck
import qualified GHC.IO.Encoding
import qualified Nix.Pretty
import qualified Options.Generic
import qualified Paths_dhall_nix
import qualified System.Exit
import qualified System.IO
data Options = Options
{ version :: Bool
<?> "Display version"
} deriving (Generic, ParseRecord)
main :: IO ()
main = handle (Dhall.detailed (do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8
Options{..} <- Options.Generic.getRecord "Compile Dhall to Nix"
if unHelpful version
then do
putStrLn (Data.Version.showVersion Paths_dhall_nix.version)
System.Exit.exitSuccess
else return ()
inText <- Data.Text.IO.getContents
expr <- case Dhall.Parser.exprFromText "(stdin)" inText of
Left err -> Control.Exception.throwIO err
Right expr -> return expr
expr' <- Dhall.Import.load expr
case Dhall.TypeCheck.typeOf expr' of
Left err -> Control.Exception.throwIO err
Right _ -> return ()
nix <- case Dhall.Nix.dhallToNix expr' of
Left err -> Control.Exception.throwIO err
Right nix -> return nix
print (Nix.Pretty.prettyNix nix) ))
handle :: IO a -> IO a
handle = Control.Exception.handle handler
where
handler :: SomeException -> IO a
handler e = case Control.Exception.fromException e of
Just ExitSuccess -> do
Control.Exception.throwIO e
_ -> do
System.IO.hPutStrLn System.IO.stderr ""
System.IO.hPrint System.IO.stderr e
System.Exit.exitFailure