hsdev-0.3.0.0: src/System/Win32/PowerShell.hs
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, LambdaCase #-}
module System.Win32.PowerShell (
-- * Escape functions
translate, translateArg,
quote, quoteDouble,
escape
) where
import Data.Char (isAlphaNum)
translate :: String -> String
translate s
| all (\ch -> isAlphaNum ch || ch `elem` "-_") s = s
| otherwise = '"' : snd (foldr escape' (True, "\"") s)
where
escape' '"' (_, s') = (True, '\\' : '"' : s')
escape' '\\' (True, s') = (True, '\\' : '\\' : s')
escape' '\\' (False, s') = (False, '\\' : s')
escape' c (_, s') = (False, c : s')
translateArg :: String -> String
translateArg s
| all isAlphaNum s = s
| otherwise = "'" ++ translate s ++ "'"
quote :: String -> String
quote s = "'" ++ concatMap (\case { '\'' -> "''"; ch -> [ch] }) s ++ "'"
quoteDouble :: String -> String
quoteDouble s = "\"" ++ concatMap (\case { '"' -> "\"\""; ch -> [ch] }) s ++ "\""
escape :: (String -> String) -> String -> String
escape fn s
| all (\ch -> isAlphaNum ch || ch `elem` "-_") s = s
| otherwise = fn s