packages feed

axel-0.0.5: app/Main.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Main where

import Axel.Error (Error)
import qualified Axel.Error as Error (toIO)
import Axel.Haskell.File (evalFile)
import Axel.Haskell.Project (buildProject, runProject)
import Axel.Parse.Args (ModeCommand(File, Project), modeCommandParser)

import Control.Monad.Except (ExceptT, MonadError)
import Control.Monad.IO.Class (MonadIO)

import Options.Applicative (execParser, info, progDesc)

newtype AppM a = AppM
  { runAppM :: ExceptT Error IO a
  } deriving (Functor, Applicative, Monad, MonadError Error, MonadIO)

runAppM' :: AppM a -> IO a
runAppM' = Error.toIO . runAppM

app :: ModeCommand -> AppM ()
app (File filePath) = evalFile filePath
app Project = buildProject >> runProject

main :: IO ()
main = do
  modeCommand <-
    execParser $ info modeCommandParser (progDesc "The command to run.")
  runAppM' $ app modeCommand