blob: 65d374bd30feb038ea4aca710f5a28568a9bd263 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
-- |
-- Copyright : (c) 2015 Egor Tensin <Egor.Tensin@gmail.com>
-- License : MIT
-- Maintainer : Egor.Tensin@gmail.com
-- Stability : experimental
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 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 = fmap not . doesDirectoryExist
data Source = Environment | Registry Env.Profile
deriving (Eq, Show)
data Options = Options
{ optName :: Env.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 Env.CurrentUser) (long "user" <> short 'u'
<> help "List current user's paths only")
<|> flag' (Registry Env.AllUsers) (long "global" <> short 'g'
<> help "List global (all users') paths only")
main :: IO ()
main = execParser parser >>= listPath
where
parser = info (helper <*> optionParser) $
fullDesc <> progDesc "List directories in your PATH"
listPath :: Options -> IO ()
listPath options = runExceptT doListPath >>= 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) = Env.query profile varName
doListPath = do
paths <- query
lift $ printPaths $ Env.pathSplit paths
printPaths paths =
filterM (shouldListPath whichPaths) paths >>= mapM_ putStrLn
|