packages feed

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

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

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

module PFile.Main.Unpack
  ( main
  ) where

import           PFile.CLI.Unpack (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} =
  either Log.panic pure <=< runExceptT $ do
    Profile.loadCurrent & runExceptT >>= \case
      Left error -> Log.panic $ Profile.showLoadCurrentError error
      Right currentProfile ->
        Profile.unpack switchOptions currentProfile
          & modifyError Profile.showUnpackError

    Profile.unsetCurrent
      & modifyError Profile.showUnsetCurrentError
  where
    switchOptions :: Profile.SwitchOptions
    switchOptions = Profile.SwitchOptions {Profile.forceRemoveOccupied}