packages feed

ghcup-0.2.6.2: lib-opt/GHCup/OptParse/Fixup.hs

{-# LANGUAGE CPP               #-}
{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE TypeApplications  #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RankNTypes #-}

module GHCup.OptParse.Fixup where


import GHCup.Command.Fixup
import GHCup.Errors
import GHCup.Prelude.Logger
import GHCup.Prelude.String.QQ
import GHCup.Types

#if !MIN_VERSION_base(4,13,0)
import           Control.Monad.Fail             ( MonadFail )
#endif
import           Control.Monad.Reader
import           Control.Monad.Trans.Resource
import           Data.Functor
import           Data.Variant.Excepts
import           Options.Applicative     hiding ( style, ParseError )
import           Prelude                 hiding ( appendFile )
import           System.Exit
import Options.Applicative.Pretty.Shim ( text )
import Control.Exception.Safe (MonadMask)

import qualified Data.Text                     as T





    ----------------
    --[ Commands ]--
    ----------------


data FixupCommand
  = FixupSymlinks
  deriving (Eq, Show)




    ---------------
    --[ Parsers ]--
    ---------------


fixupP :: Parser FixupCommand
fixupP =
  subparser
      (  command
          "symlinks"
          (   FixupSymlinks
          <$ info
                helper
                (  progDesc "Fix up symlinks in bin/"
                <> footerDoc (Just $ text toolFooter)
                )
          )
      )
 where
  toolFooter :: String
  toolFooter = [s|Discussion:
  Fix up common issues.

Examples:
  ghcup fixup symlinks|]







    ---------------------------
    --[ Effect interpreters ]--
    ---------------------------


type FixupEffects = '[MalformedInstallInfo, ParseError]




    ------------------
    --[ Entrypoint ]--
    ------------------



fixup :: ( Monad m
         , MonadMask m
         , MonadUnliftIO m
         , MonadFail m
         )
      => FixupCommand
      -> (IO (AppState, IO ()), LeanAppState)
      -> m ExitCode
fixup command' (getAppState', leanAppstate) = run (do
     case command' of
       FixupSymlinks ->
         liftE fixupSymlinks
   ) >>= \case
            (VRight _, up) -> do
              liftIO up
              pure ExitSuccess
            (VLeft e, _) -> do
              runLogger $ logError $ T.pack $ prettyHFError e
              pure $ ExitFailure 27
 where
  runLogger = flip runReaderT leanAppstate
  run action' = do
    (appstate', up) <- liftIO getAppState'
    r <- flip runReaderT appstate'
                  . runResourceT
                  . runE
                    @FixupEffects
                  $ action'
    pure (r, up)