packages feed

pfile-0.1.0.0: src/PFile/Main/Switch.hs

{- |
Module:      PFile.Main.Switch
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 switch`.
-}

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

module PFile.Main.Switch
  ( main
  ) where

import           PFile.CLI.Switch (Options (..))
import           PFile.Env        (Env)
import           PFile.Error      (modifyError)
import qualified PFile.Log        as Log
import qualified PFile.Profile    as Profile
import           Protolude

main :: (MonadReader Env m, MonadIO m) => Options -> m ()
main Options {forceRemoveOccupied, nextProfileName} =
  either Log.panic pure <=< runExceptT $ do
    nextProfile <-
      Profile.load (Profile.Name nextProfileName) & runExceptT >>= \case
        Left error -> do
          Log.info $ Profile.showLoadError error
          Log.panic $ "Unable to load profile: \"" <> nextProfileName <> "\""
        Right profile -> pure profile

    Profile.loadCurrent & runExceptT >>= \case
      Left error -> do
        Log.info $ Profile.showLoadCurrentError error
        Profile.link switchOptions nextProfile
          & modifyError Profile.showLinkError
      Right currentProfile ->
        Profile.switch switchOptions currentProfile nextProfile
          & modifyError Profile.showSwitchError

    Profile.setCurrent nextProfile
      & modifyError Profile.showSetCurrentError
  where
    switchOptions :: Profile.SwitchOptions
    switchOptions = Profile.SwitchOptions {Profile.forceRemoveOccupied}