diff options
Diffstat (limited to 'bin/SetEnv.hs')
-rw-r--r-- | bin/SetEnv.hs | 72 |
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 |