module Agda.Utils.Environment ( expandEnvironmentVariables ) where
import Data.Char
import Data.Maybe
import System.Environment
import System.Directory ( getHomeDirectory )
expandEnvironmentVariables :: String -> IO String
expandEnvironmentVariables s = do
env <- getEnvironment
home <- getHomeDirectory
return $ expandVars home env s
expandVars :: String -> [(String, String)] -> String -> String
expandVars home env s = concatMap repl $ tokens s
where
repl Home = home ++ "/"
repl (Var x) = fromMaybe "" $ lookup x env
repl (Str s) = s
data Token = Home | Var String | Str String
deriving (Eq, Show)
tokens :: String -> [Token]
tokens s = case s of
'~' : '/' : s -> Home : tokens' s
'\\' : '~' : s -> cons '~' $ tokens' s
_ -> tokens' s
where
tokens' :: String -> [Token]
tokens' s =
case s of
'$' : '$' : s -> cons '$' $ tokens' s
'$' : s@(c : _) | c == '_' || isAlpha c -> Var x : tokens' s'
where (x, s') = span (\ c -> c == '_' || isAlphaNum c) s
'$' : '{' : s ->
case break (== '}') s of
(x, '}' : s) -> Var x : tokens' s
_ -> [Str $ "${" ++ s]
c : s -> cons c $ tokens' s
"" -> []
cons c (Str s : ts) = Str (c : s) : ts
cons c ts = Str [c] : ts