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