{-# LANGUAGE NoImplicitPrelude #-}

module Stack.Options.CleanParser where

import           Options.Applicative
import           Stack.Clean                       (CleanCommand(..), CleanOpts (..))
import           Stack.Prelude
import           Stack.Types.PackageName

-- | Command-line parser for the clean command.

cleanOptsParser :: CleanCommand -> Parser CleanOpts
cleanOptsParser :: CleanCommand -> Parser CleanOpts
cleanOptsParser CleanCommand
Clean = [PackageName] -> CleanOpts
CleanShallow forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser [PackageName]
packages forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser CleanOpts
doFullClean
  where
    packages :: Parser [PackageName]
packages =
        forall (f :: * -> *) a. Alternative f => f a -> f [a]
many
            (Mod ArgumentFields PackageName -> Parser PackageName
packageNameArgument
                 (forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PACKAGE" forall a. Semigroup a => a -> a -> a
<>
                  forall (f :: * -> *) a. String -> Mod f a
help String
"If none specified, clean all project packages"))
    doFullClean :: Parser CleanOpts
doFullClean =
        forall a. a -> Mod FlagFields a -> Parser a
flag'
            CleanOpts
CleanFull
            (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"full" forall a. Semigroup a => a -> a -> a
<>
             forall (f :: * -> *) a. String -> Mod f a
help String
"Delete the project’s stack working directories (.stack-work by default).")

cleanOptsParser CleanCommand
Purge = forall (f :: * -> *) a. Applicative f => a -> f a
pure CleanOpts
CleanFull