ddc-tools-0.3.1.1: src/ddci-core/DDCI/Core/Interface/Batch.hs
module DDCI.Core.Interface.Batch
(runBatch)
where
import DDCI.Core.State
import DDCI.Core.Input
import Data.List
-- | Run in batch mode, reading commands from the given string.
runBatch :: FilePath -> String -> IO ()
runBatch filePath str
= do let state = initState (InterfaceBatch filePath)
let inputState = InputState Nothing InputLine 1 []
loop state inputState (lines str)
where
-- No more lines, we're done.
-- There might be a command in the buffer though.
loop state inputState []
= do eatLine state inputState []
return ()
loop state inputState (l:ls)
-- Echo comment lines back.
| isPrefixOf "--" l
= do putStrLn l
let inputState'
= inputState
{ inputLineNumber = inputLineNumber inputState + 1 }
loop state inputState' ls
-- Echo blank lines back if we're between commands.
| Nothing <- inputCommand inputState
, null l
= do putStr "\n"
let inputState'
= inputState
{ inputLineNumber = inputLineNumber inputState + 1 }
loop state inputState' ls
-- Quit the program.
| isPrefixOf ":quit" l
= do return ()
-- Handle a line of input.
| otherwise
= do (state', inputState') <- eatLine state inputState l
loop state' inputState' ls