{- |
Module:      PFile.Main.Which
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)

Main for `pfile which`.
-}

{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE OverloadedStrings #-}

module PFile.Main.Which
  ( main
  ) where

import           PFile.CLI.Which (Options (..))
import           PFile.Env       (Env)
import qualified PFile.Log       as Log
import qualified PFile.Profile   as Profile
import           Protolude

main :: (MonadReader Env m, MonadIO m) => Options -> m ()
main :: forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Options -> m ()
main Options
Options =
  ExceptT LoadCurrentError m Profile
forall (m :: * -> *).
(MonadReader Env m, MonadError LoadCurrentError m, MonadIO m) =>
m Profile
Profile.loadCurrent ExceptT LoadCurrentError m Profile
-> (ExceptT LoadCurrentError m Profile
    -> m (Either LoadCurrentError Profile))
-> m (Either LoadCurrentError Profile)
forall a b. a -> (a -> b) -> b
& ExceptT LoadCurrentError m Profile
-> m (Either LoadCurrentError Profile)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT m (Either LoadCurrentError Profile)
-> (Either LoadCurrentError Profile -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Left LoadCurrentError
error -> do
      Text -> m ()
forall (m :: * -> *).
(MonadReader Env m, MonadIO m) =>
Text -> m ()
Log.info (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ LoadCurrentError -> Text
Profile.showLoadCurrentError LoadCurrentError
error
      Text -> m ()
forall (m :: * -> *) a. MonadIO m => Text -> m a
Log.panic
        (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$  Text
"No current profile set. Use `pfile new` to create a profile and"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" `pfile switch` to switch to it."
    Right Profile.Profile {name :: Profile -> Name
Profile.name = Profile.Name Text
name} -> Text -> m ()
forall a (m :: * -> *). (Print a, MonadIO m) => a -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
putStrLn Text
name