packages feed

dojang-0.2.0: src/Dojang/Commands/Env.hs

{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE NoFieldSelectors #-}

module Dojang.Commands.Env (env) where

import Control.Monad.IO.Class (MonadIO (liftIO))
import System.Exit (ExitCode (..))
import Prelude hiding (putStr)

import Control.Monad.Except (MonadError (..))
import Control.Monad.Logger (logDebugSH, logError)
import Data.Text.IO (putStr)
import Options.Applicative.Path (hyphen)
import System.OsPath (OsPath)
import TextShow (TextShow (showt))

import Dojang.App (App, currentEnvironment')
import Dojang.ExitCodes (fileWriteError)
import Dojang.MonadFileSystem (MonadFileSystem)
import Dojang.Syntax.Env (writeEnvFile, writeEnvironment)
import Dojang.Types.Environment.Current (MonadEnvironment (..))


env :: (MonadFileSystem i, MonadIO i) => Bool -> OsPath -> App i ExitCode
env ignoreEnvFile outputPath = do
  currentEnv <-
    if ignoreEnvFile then liftIO currentEnvironment else currentEnvironment'
  $(logDebugSH) currentEnv
  if outputPath == hyphen
    then do
      liftIO $ putStr $ writeEnvironment currentEnv
      return ExitSuccess
    else
      ( do
          () <- writeEnvFile currentEnv outputPath
          return ExitSuccess
      )
        `catchError` \err -> do
          $(logError) $ showt err
          return fileWriteError