packages feed

stack-3.9.1: src/Stack/Options/CleanParser.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ApplicativeDo     #-}

{-|
Module      : Stack.Options.CleanParser
License     : BSD-3-Clause
-}

module Stack.Options.CleanParser
  ( cleanOptsParser
  ) where

import           Options.Applicative ( Parser, flag', help, idm, long, metavar )
import           Options.Applicative.Builder.Extra ( boolFlags )
import           Stack.Clean
                   ( CleanCommand (..), CleanDepth (..), CleanOpts (..) )
import           Stack.Prelude
import           Stack.Types.PackageName ( packageNameArgument )

-- | Command-line parser for the clean command.
cleanOptsParser :: CleanCommand -> Parser CleanOpts
cleanOptsParser Clean = shallowParser <|> fullParser

cleanOptsParser Purge = pure $ CleanOpts
  { depth = CleanFull
  , omitThis = False
  }

shallowParser :: Parser CleanOpts
shallowParser = do
  packages <- parsePackages
  omitThis <- parseOmitThis
  pure $ CleanOpts
    { depth = CleanShallow packages
    , omitThis
    }
 where
  parsePackages = many (packageNameArgument
    (  metavar "PACKAGE"
    <> help "If none specified, clean all project packages."
    ))
  parseOmitThis = boolFlags False
    "omit-this"
    "the omission of directories currently in use"
    idm

fullParser :: Parser CleanOpts
fullParser = do
  depth <- doFullClean
  pure $ CleanOpts
    { depth
    , omitThis = False
    }
 where
  doFullClean = flag' CleanFull
    (  long "full"
    <> help "Delete the project's Stack work directories (.stack-work by \
            \default)."
    )