module PfeInteractive(pfeiCmd,pfeiAllCmds,runSIO) where import Prelude hiding (getContents,print,catch,putStrLn,writeFile) import AbstractIO import PfeParse import PFE0(projectStatus,checkProject,setBatchMode,withProjectDir',newProjectHelp) import Pfe0Cmds(addHelpCmd) import PfeSocket(listenOnPFE,acceptPFE,removePFE,serverOps,sResult,errorString) import qualified IO import SIO pfeiAllCmds pfeCmds prg = addHelpCmd prg (pfeCmds++pfeiCmd pfeCmds prg) pfeiCmd pfeCmds prg = [("interactive",(noArgs pfeI,"read pfe commands from stdin")), ("server", (noArgs pfeS,"start a PFE server"))] where pfeI = do setBatchMode False putStrLn "--- pfe interactive starts ---" mapM_ (doPfeCmd . words) . lines =<< getContents putStrLn "--- pfe interactive ends ---" doPfeICmd cmd = do doPfeCmd cmd `catch` printError putStrLn "--- pfe interactive ---" doPfeCmd cmd = doCmd (pfeCmds',projectStatus) prg cmd pfeCmds' = addHelpCmd prg pfeCmds pfeS = do --s <- inBase $ listenOn (PortNumber 9999) --withServerFile (flip writeFile "9999") s <- withProjectDir'' (inBase . listenOnPFE) setBatchMode False tryThen (loop $ server s) (withProjectDir'' (inBase . removePFE)) server s = do (h,host,port) <- inBase $ acceptPFE s --print (host,port) r <- try $ withStdio (serverOps h) (serve h) inBase $ sResult h r --putStrLn "done" inBase $ IO.hClose h where serve h = doPfeCmd . words =<< inBase (IO.hGetLine h) withProjectDir'' m = withProjectDir' newProjectHelp m loop m = l where l = m >> l printError e = ePutStrLn (errorString e)