module App.Widgets.Environment where
import Control.Monad
import Data.Either
import Data.List (elem)
import App.EventBus
import System.Environment
import Data.Maybe
import Text.Parsec hiding (many)
import Control.Applicative
isNotBlankLine = (/=0) . length . filter (/=' ') . filter (/='\t')
isNotCommentLine = not . (=='#') . head
hasValue = elem '='
parseConfigLine = liftA2 (,) (many1 alphaNum) (spaces *> char '=' *> many anyChar)
commandLineArgsWidget :: Widget [EData a]
commandLineArgsWidget b = getArgs >>=
\args -> produce' "Environment" "CommandLineArgsWidget" "argv" Persistent [EStringL args] b
configFileWidget :: String -> Widget [EData a]
configFileWidget f b = configLines >>= mapM_ produceConfigDataEvent
where produceConfigDataEvent (n,v) = produce' "Environment" (f ++ ".ConfigFileWidget") n Persistent [EString v] b
configLines = rights . map (parse parseConfigLine "(Unknown line in config file)")
. filter isNotBlankLine
. filter isNotCommentLine
. filter hasValue
. lines
<$> readFile f
environmentWidget :: Widget [EData a]
environmentWidget b = getEnvironment >>=
mapM_ (\(k,v) -> produce' "Environment" "EnvironmentWidget" k Persistent [EString v] b)
progNameWidget :: Widget [EData a]
progNameWidget b = getProgName >>=
\v -> produce' "Environment" "ProgramNameWidget" "ProgramName" Persistent [EString v] b