packages feed

phatsort-0.6.0.0: app/Options.hs

------------------------------------------------------------------------------
-- |
-- Module      : Options
-- Description : CLI options and help documentation
-- Copyright   : Copyright (c) 2019-2023 Travis Cardwell
-- License     : MIT
------------------------------------------------------------------------------

{-# LANGUAGE CPP #-}

#if defined(MIN_VERSION_ansi_wl_pprint)
#if MIN_VERSION_ansi_wl_pprint (1,0,2)
{-# OPTIONS_GHC -Wno-warnings-deprecations #-}
#endif
#endif

module Options where

-- https://hackage.haskell.org/package/base
import Data.Bool (bool)

-- https://hackage.haskell.org/package/optparse-applicative
import qualified Options.Applicative as OA

-- (phatsort)
import PhatSort.SortOptions
  ( SortCase(CaseInsensitive, CaseSensitive)
  , SortFirst(FirstDirs, FirstFiles, FirstNone)
  , SortOrder(OrderName, OrderRandom, OrderTime)
  )

-- (phatsort:executable)
import qualified LibOA

------------------------------------------------------------------------------

caseOption :: OA.Parser SortCase
caseOption = fmap (bool CaseSensitive CaseInsensitive) . OA.switch $
    mconcat
      [ OA.long "case"
      , OA.short 'c'
      , OA.help "case-insensitive sort"
      ]

------------------------------------------------------------------------------

exitCodeHelp :: LibOA.Doc
exitCodeHelp = LibOA.section "Exit codes:" $ LibOA.table_ 2
    [ ["0", "no error"]
    , ["1", "execution error"]
    , ["2", "command line error"]
    ]

------------------------------------------------------------------------------

firstOption :: OA.Parser SortFirst
firstOption = OA.option (OA.eitherReader parseFirst) $ mconcat
    [ OA.long "first"
    , OA.short 'f'
    , OA.metavar "TYPE"
    , OA.value FirstNone
    , OA.help "sort certain directory entries first"
    ]
  where
    parseFirst :: String -> Either String SortFirst
    parseFirst "dirs" = Right FirstDirs
    parseFirst "files" = Right FirstFiles
    parseFirst _ = Left "unknown first option; \"dirs\" or \"files\" expected"

------------------------------------------------------------------------------

firstTypeHelp :: LibOA.Doc
firstTypeHelp = LibOA.section "TYPE choices:" $ LibOA.table_ 2
    [ ["dirs", "sort directories before files"]
    , ["files", "sort files before directories"]
    ]

------------------------------------------------------------------------------

noSyncOption :: OA.Parser Bool
noSyncOption = fmap not . OA.switch $ mconcat
    [ OA.long "no-sync"
    , OA.short 'n'
    , OA.help "do not sync after each command"
    ]

------------------------------------------------------------------------------

orderOption :: OA.Parser SortOrder
orderOption = OA.option (OA.eitherReader parseOrder) $ mconcat
    [ OA.long "order"
    , OA.short 'o'
    , OA.metavar "ORDER"
    , OA.value OrderName
    , OA.help "desired order (default: name)"
    ]
  where
    parseOrder :: String -> Either String SortOrder
    parseOrder "name" = Right OrderName
    parseOrder "time" = Right OrderTime
    parseOrder "random" = Right OrderRandom
    parseOrder _ = Left "unknown ORDER"

------------------------------------------------------------------------------

orderHelp :: LibOA.Doc
orderHelp = LibOA.section "ORDER choices:" $ LibOA.table_ 2
    [ ["name", "sort by filename"]
    , ["time", "sort by modification time"]
    , ["random", "random order"]
    ]

------------------------------------------------------------------------------

reverseOption :: OA.Parser Bool
reverseOption = OA.switch $ mconcat
    [ OA.long "reverse"
    , OA.short 'r'
    , OA.help "reverse sort"
    ]

------------------------------------------------------------------------------

scriptOption :: OA.Parser Bool
scriptOption = OA.switch $ mconcat
    [ OA.long "script"
    , OA.short 's'
    , OA.help "output script instead of executing"
    ]

------------------------------------------------------------------------------

verboseOption :: OA.Parser Bool
verboseOption = OA.switch $ mconcat
    [ OA.long "verbose"
    , OA.short 'v'
    , OA.help "display progress"
    ]