module Main(main) where import Control.Exception import Data.Attoparsec.Enumerator (iterParser, ParseError, errorContexts) import Data.ByteString (ByteString,pack) import Data.Enumerator (Enumerator, Iteratee, enumLists, run, ($$)) import Data.Enumerator.Binary (enumHandle) import System.Exit import System.IO (hSetBinaryMode,stdin) import Network.EBus.Layer2 main :: IO () main = do -- * Select binary mode (True) or text mode (False) on a open handle. (See also openBinaryFile.) hSetBinaryMode stdin True loop 900 where loop :: Int -> IO() loop 0 = do print "finished" loop n = do readAndDumpPacket loop $ n - 1 -- | Read one eBus Packet and dump layer2 to stdout readAndDumpPacket :: IO() readAndDumpPacket = do -- * run -- Run an iteratee until it finishes, and return either the final value (if it succeeded) or the error (if it failed). -- * run_ -- Like run, except errors are converted to exceptions and thrown. Primarily useful for small scripts or other simple cases. maybePacket <- run( stdinEnumerator $$ parserIteratee) case maybePacket of Right result -> do { print "Result"; print $ result} Left exc -> case fromException (exc::SomeException) of Just e | any (\ctx -> ctx == "demandInput") (errorContexts (e::ParseError)) -> do putStrLn "EOF reached" exitWith $ ExitFailure 1 | otherwise -> do putStr "Other Error: "; print e _ -> putStr "" stdinEnumerator :: Enumerator ByteString IO a stdinEnumerator = enumHandle 1 stdin parserIteratee :: Iteratee ByteString IO EbusPacket parserIteratee = do p <- iterParser ebusParserLayer2 return p