packages feed

hpack-dhall-0.2.0: src/Hpack/Dhall.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
module Hpack.Dhall where

import           Control.Monad.Trans.Except
import           Control.Monad.IO.Class
import           Data.Bifunctor
import           Data.Aeson
import qualified Data.Text.Lazy.IO as LT
import           System.Environment
import qualified Dhall.Parser
import qualified Dhall.Import
import qualified Dhall.TypeCheck
import qualified Dhall.JSON

import qualified Hpack

packageConfig :: FilePath
packageConfig = "package.dhall"

decodeDhall :: FilePath -> IO (Either String Value)
decodeDhall file = runExceptT $ do
  expr <- readInput >>= parseExpr >>= liftIO . Dhall.Import.load
  _ <- liftResult $ Dhall.TypeCheck.typeOf expr
  liftResult $ Dhall.JSON.dhallToJSON expr
  where
    readInput = liftIO (LT.readFile file)
    parseExpr = liftResult . Dhall.Parser.exprFromText file
    liftResult = ExceptT . return . first show

main :: IO ()
main = do
  getArgs >>= Hpack.getOptions packageConfig >>= \ case
    Just (verbose, options) -> Hpack.hpack verbose (Hpack.setDecode decodeDhall options)
    Nothing -> return ()