aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--README.md17
-rw-r--r--apps/ListPath.hs32
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