packages feed

headroom-0.1.3.0: app/Main.hs

{-|
Module      : Main
Description : Application entry point
Copyright   : (c) 2019-2020 Vaclav Svejcar
License     : BSD-3
Maintainer  : vaclav.svejcar@gmail.com
Stability   : experimental
Portability : POSIX

Functions responsible for application bootstrap.
-}
{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import           Headroom.Command               ( Command(..)
                                                , commandParser
                                                )
import           Headroom.Command.Gen           ( commandGen )
import           Headroom.Command.Gen.Env       ( GenMode(..)
                                                , GenOptions(GenOptions)
                                                )
import           Headroom.Command.Init          ( commandInit )
import           Headroom.Command.Init.Env      ( InitOptions(InitOptions) )
import           Headroom.Command.Run           ( commandRun )
import           Headroom.Command.Run.Env       ( RunOptions(RunOptions) )
import           Headroom.License               ( LicenseType
                                                , parseLicenseType
                                                )
import           Headroom.Types                 ( HeadroomError(..)
                                                , InitCommandError(..)
                                                )
import           Options.Applicative
import           Prelude                        ( putStrLn )
import           RIO

main :: IO ()
main = do
  command' <- execParser commandParser
  catch
    (bootstrap command')
    (\ex -> do
      putStrLn $ "ERROR: " <> displayException (ex :: HeadroomError)
      exitWith $ ExitFailure 1
    )

bootstrap :: Command -> IO ()
bootstrap = \case
  Run sourcePaths templatePaths variables runMode debug ->
    commandRun (RunOptions runMode sourcePaths templatePaths variables debug)
  c@(Gen _ _) -> do
    genMode <- parseGenMode c
    commandGen (GenOptions genMode)
  Init licenseType sourcePaths -> do
    licenseType' <- parseLicenseType' licenseType
    commandInit (InitOptions sourcePaths licenseType')

parseGenMode :: MonadThrow m => Command -> m GenMode
parseGenMode = \case
  Gen True  Nothing        -> pure GenConfigFile
  Gen False (Just license) -> pure $ GenLicense license
  _                        -> throwM NoGenModeSelected

parseLicenseType' :: MonadThrow m => Text -> m LicenseType
parseLicenseType' input = case parseLicenseType input of
  Just licenseType -> pure licenseType
  Nothing          -> throwM $ InitCommandError $ InvalidLicenseType input