From 84a762a0c1d83234a12c3219f8d4db1542e5cb12 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Sat, 20 Aug 2016 09:06:01 +0300 Subject: list_path: no weird symbols in output Get rid of the stupid "-" and "+" symbols to mark missing/existing directories, add corresponding command line options instead. --- README.md | 17 ++++++++++------- apps/ListPath.hs | 32 +++++++++++++++++++------------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 2c41648..04368cb 100644 --- a/README.md +++ b/README.md @@ -55,16 +55,19 @@ List directories in your `PATH` variable: ``` > list_path -- C:\Program Files\Haskell\bin -+ C:\Program Files\Haskell Platform\8.0.1\lib\extralibs\bin -+ C:\Program Files\Haskell Platform\8.0.1\bin -+ C:\Users\Egor\AppData\Roaming\local\bin -- C:\Users\Egor\AppData\Roaming\cabal\bin +C:\Program Files\Haskell\bin +C:\Program Files\Haskell Platform\8.0.1\lib\extralibs\bin +C:\Program Files\Haskell Platform\8.0.1\bin +C:\Users\Egor\AppData\Roaming\local\bin +C:\Users\Egor\AppData\Roaming\cabal\bin ... ``` -Lines starting with `+` denote existing directories. -Conversely, lines starting with `-` denote missing directories. +``` +> list_path --missing +C:\Users\Egor\AppData\Roaming\cabal\bin +... +``` ### add_path diff --git a/apps/ListPath.hs b/apps/ListPath.hs index 086a219..bed1978 100644 --- a/apps/ListPath.hs +++ b/apps/ListPath.hs @@ -6,7 +6,7 @@ module Main (main) where -import Control.Monad (liftM) +import Control.Monad (filterM, liftM) import Data.Maybe (fromMaybe) import System.Directory (doesDirectoryExist) import System.Environment (lookupEnv) @@ -14,16 +14,30 @@ import System.Environment (lookupEnv) import Options.Applicative import qualified Windows.Environment as Env +data WhichPaths = All | ExistingOnly | MissingOnly + deriving (Eq, Show) + +shouldListPath :: WhichPaths -> Env.VarValue -> IO Bool +shouldListPath All = return . const True +shouldListPath ExistingOnly = doesDirectoryExist +shouldListPath MissingOnly = liftM not . doesDirectoryExist + data Options = Options { optName :: Env.VarName + , optWhichPaths :: WhichPaths } deriving (Eq, Show) optionParser :: Parser Options -optionParser = Options <$> optNameDesc +optionParser = Options <$> optNameDesc <*> optWhichPathsDesc where optNameDesc = strOption $ long "name" <> short 'n' <> metavar "NAME" <> value "PATH" <> help "Variable name ('PATH' by default)" + optWhichPathsDesc = pure All + <|> flag' ExistingOnly (long "existing" <> short 'e' + <> help "List existing paths only") + <|> flag' MissingOnly (long "missing" <> short 'm' + <> help "List missing paths only") main :: IO () main = execParser parser >>= listPath @@ -37,17 +51,9 @@ listPath options = do printPaths $ Env.pathSplit oldValue where varName = optName options + whichPaths = optWhichPaths options query = liftM (fromMaybe "") $ lookupEnv varName - prefix exists - | exists = "+ " - | otherwise = "- " - - formatPath exists path = prefix exists ++ path - - printPath path = do - exists <- doesDirectoryExist path - putStrLn $ formatPath exists path - - printPaths = mapM_ printPath + printPaths paths = + filterM (shouldListPath whichPaths) paths >>= mapM_ putStrLn -- cgit v1.2.3