aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/bin/SetEnv.hs
diff options
context:
space:
mode:
Diffstat (limited to 'bin/SetEnv.hs')
-rw-r--r--bin/SetEnv.hs72
1 files changed, 72 insertions, 0 deletions
diff --git a/bin/SetEnv.hs b/bin/SetEnv.hs
new file mode 100644
index 0000000..87d7812
--- /dev/null
+++ b/bin/SetEnv.hs
@@ -0,0 +1,72 @@
+-- |
+-- 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 (void)
+import Control.Monad.Trans.Except (runExceptT)
+import System.IO.Error (ioError)
+
+import Options.Applicative
+
+import qualified WindowsEnv
+
+import Prompt
+import PromptMessage
+
+data Options = Options
+ { optYes :: Bool
+ , optGlobal :: Bool
+ , optName :: WindowsEnv.VarName
+ , optValue :: WindowsEnv.VarValue
+ } deriving (Eq, Show)
+
+optionParser :: Parser Options
+optionParser = Options
+ <$> optYesDesc
+ <*> optGlobalDesc
+ <*> optNameDesc
+ <*> optValueDesc
+ where
+ optYesDesc = switch
+ $ long "yes" <> short 'y'
+ <> help "Skip confirmation prompt"
+ optGlobalDesc = switch
+ $ long "global" <> short 'g'
+ <> help "Set for all users"
+ optNameDesc = argument str
+ $ metavar "NAME"
+ <> help "Variable name"
+ optValueDesc = argument str
+ $ metavar "VALUE"
+ <> help "Variable value"
+
+main :: IO ()
+main = execParser parser >>= setEnv
+ where
+ parser = info (helper <*> optionParser) $
+ fullDesc <> progDesc "Define environment variables"
+
+setEnv :: Options -> IO ()
+setEnv options = runExceptT doSetEnv >>= either ioError return
+ where
+ varName = optName options
+ varValue = optValue options
+
+ forAllUsers = optGlobal options
+ profile
+ | forAllUsers = WindowsEnv.AllUsers
+ | otherwise = WindowsEnv.CurrentUser
+
+ skipPrompt = optYes options
+ promptAnd
+ | skipPrompt = withoutPrompt
+ | otherwise = withPrompt $ newMessage profile varName varValue
+
+ engrave = WindowsEnv.engraveForce profile varName varValue
+
+ doSetEnv = void $ promptAnd engrave