{- |
Module:      PFile.Main
Copyright:   (c) 2024 Illia Shkroba
License:     BSD3
Maintainer:  Illia Shkroba <is@pjwstk.edu.pl>
Stability:   unstable
Portability: non-portable (Non-Unix systems are not supported)

PFile's Main.
-}

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE NamedFieldPuns #-}

module PFile.Main
  ( main
  ) where

import           Options.Applicative (execParser)
import           PFile.CLI           (Command (..), Options (..), parserInfo)
import qualified PFile.Env           as Env
import qualified PFile.Log           as Log
import qualified PFile.Main.List     as List
import qualified PFile.Main.New      as New
import qualified PFile.Main.Switch   as Switch
import qualified PFile.Main.Unpack   as Unpack
import qualified PFile.Main.Which    as Which
import           Protolude

main :: IO ()
main :: IO ()
main = do
  Options {Bool
verbose :: Bool
verbose :: Options -> Bool
verbose, Command
command :: Command
command :: Options -> Command
command} <- ParserInfo Options -> IO Options
forall a. ParserInfo a -> IO a
execParser ParserInfo Options
parserInfo
  Env
env <- Options -> IO Env
forall (m :: * -> *). MonadIO m => Options -> m Env
Env.resolve Env.Options {Bool
verbose :: Bool
verbose :: Bool
Env.verbose}
  (ReaderT Env IO () -> Env -> IO ())
-> Env -> ReaderT Env IO () -> IO ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT Env IO () -> Env -> IO ()
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Env
env do
    Text -> ReaderT Env IO ()
forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Text -> m ()
Log.info (Text -> ReaderT Env IO ()) -> Text -> ReaderT Env IO ()
forall a b. (a -> b) -> a -> b
$ Env -> Text
Env.description Env
env
    case Command
command of
      New Options
options    -> Options -> ReaderT Env IO ()
forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Options -> m ()
New.main Options
options
      Switch Options
options -> Options -> ReaderT Env IO ()
forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Options -> m ()
Switch.main Options
options
      Unpack Options
options -> Options -> ReaderT Env IO ()
forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Options -> m ()
Unpack.main Options
options
      List Options
options   -> Options -> ReaderT Env IO ()
forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Options -> m ()
List.main Options
options
      Which Options
options  -> Options -> ReaderT Env IO ()
forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Options -> m ()
Which.main Options
options