diff options
Diffstat (limited to 'bin/ListPaths.hs')
-rw-r--r-- | bin/ListPaths.hs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/bin/ListPaths.hs b/bin/ListPaths.hs new file mode 100644 index 0000000..666423f --- /dev/null +++ b/bin/ListPaths.hs @@ -0,0 +1,84 @@ +-- | +-- Copyright : (c) 2015 Egor Tensin <Egor.Tensin@gmail.com> +-- License : MIT +-- Maintainer : Egor.Tensin@gmail.com +-- Stability : experimental +-- Portability : Windows-only + +module Main (main) where + +import Control.Monad (filterM) +import Control.Monad.Trans.Class (lift) +import Control.Monad.Trans.Except (runExceptT) +import Data.Maybe (fromMaybe) +import System.Directory (doesDirectoryExist) +import System.Environment (lookupEnv) +import System.IO.Error (ioError) + +import Options.Applicative + +import qualified WindowsEnv + +data WhichPaths = All | ExistingOnly | MissingOnly + deriving (Eq, Show) + +shouldListPath :: WhichPaths -> WindowsEnv.VarValue -> IO Bool +shouldListPath All = return . const True +shouldListPath ExistingOnly = doesDirectoryExist +shouldListPath MissingOnly = fmap not . doesDirectoryExist + +data Source = Environment | Registry WindowsEnv.Profile + deriving (Eq, Show) + +data Options = Options + { optName :: WindowsEnv.VarName + , optWhichPaths :: WhichPaths + , optSource :: Source + } deriving (Eq, Show) + +optionParser :: Parser Options +optionParser = Options + <$> optNameDesc + <*> optWhichPathsDesc + <*> optSourceDesc + 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") + optSourceDesc = pure Environment + <|> flag' (Registry WindowsEnv.CurrentUser) (long "user" <> short 'u' + <> help "List current user's paths only") + <|> flag' (Registry WindowsEnv.AllUsers) (long "global" <> short 'g' + <> help "List global (all users') paths only") + +main :: IO () +main = execParser parser >>= listPaths + where + parser = info (helper <*> optionParser) $ + fullDesc <> progDesc "List directories in your PATH" + +listPaths :: Options -> IO () +listPaths options = runExceptT doListPaths >>= either ioError return + where + varName = optName options + whichPaths = optWhichPaths options + source = optSource options + + query = queryFrom source + + queryFrom Environment = lift $ fromMaybe "" <$> lookupEnv varName + queryFrom (Registry profile) = WindowsEnv.query profile varName + + filterPaths = filterM $ shouldListPath whichPaths + + doListPaths = do + paths <- WindowsEnv.pathSplit <$> query + lift $ do + pathsToPrint <- filterPaths paths + mapM_ putStrLn pathsToPrint |