packages feed

hwm-0.1.0: src/HWM/CLI/Command/Environment/Remove.hs

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

module HWM.CLI.Command.Environment.Remove (EnvRemoveOptions, runEnvRemove) where

import Control.Monad.Except (MonadError (throwError))
import HWM.Core.Common (Name)
import HWM.Core.Parsing (ParseCLI (..))
import HWM.Domain.Config (Config (..))
import HWM.Domain.ConfigT (ConfigT, updateConfig)
import HWM.Domain.Environments (existsEnviroment, printEnvironments, removeEnvironmentByName)
import Options.Applicative (help, metavar, strArgument)
import Relude

newtype EnvRemoveOptions = EnvRemoveOptions
  {envName :: Name}
  deriving (Show)

instance ParseCLI EnvRemoveOptions where
  parseCLI =
    EnvRemoveOptions
      <$> strArgument (metavar "ENVIRONMENT" <> help "Name of the environment to remove")

runEnvRemove :: EnvRemoveOptions -> ConfigT ()
runEnvRemove EnvRemoveOptions {..} = do
  exists <- existsEnviroment envName
  unless exists $ throwError $ fromString $ "Environment '" <> toString envName <> "' does not exist."
  updateConfig
    (\cfg@Config {..} -> pure cfg {cfgEnvironments = removeEnvironmentByName envName cfgEnvironments})
    (printEnvironments Nothing)