packages feed

hwm-0.5.0: src/HWM/CLI/Command/Environment/Add.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NoImplicitPrelude #-}

module HWM.CLI.Command.Environment.Add (EnvAddOptions, runEnvAdd) where

import Control.Monad.Except (throwError)
import HWM.Core.Common (Name)
import HWM.Core.Formatting (Format (..))
import HWM.Core.Parsing (Parse (..), ParseCLI (..))
import HWM.Core.Version (Version)
import HWM.Domain.Config (Config (..))
import HWM.Domain.ConfigT (ConfigT, updateConfig)
import HWM.Domain.Environments (addProfile, existsEnvironment, mkEnvironment, printEnvironments)
import HWM.Runtime.UI (minRowSize, section, uiRow)
import Options.Applicative (help, metavar, strArgument)
import Options.Applicative.Builder (argument, str)
import Relude

data EnvAddOptions = EnvAddOptions
  { envName :: Name,
    envGHC :: Version
  }
  deriving (Show)

instance ParseCLI EnvAddOptions where
  parseCLI =
    EnvAddOptions
      <$> strArgument (metavar "NAME" <> help "Name of the environment to add")
      <*> argument (str >>= parse) (metavar "GHC" <> help "GHC version (e.g. 8.10.7)")

runEnvAdd :: EnvAddOptions -> ConfigT ()
runEnvAdd EnvAddOptions {..} = do
  exists <- existsEnvironment envName
  if exists
    then do
      printEnvironments
      throwError $ fromString $ "Environment '" <> toString envName <> "' already exists."
    else do
      section "new environment" $ do
        uiRow minRowSize "name" envName
        uiRow minRowSize "ghc" (format envGHC)
      updateConfig
        (\cfg@Config {..} -> pure cfg {cfgEnvironments = addProfile envName (mkEnvironment envGHC) cfgEnvironments})
        (pure ())