module Hasql.Core.Loops.Receiver where
import Hasql.Prelude
import Hasql.Core.Model
import qualified Hasql.Core.Socket as A
import qualified Data.ByteString as B
import qualified Scanner as C
import qualified Hasql.Core.Scanner as D
loop :: A.Socket -> (Response -> IO ()) -> (Text -> IO ()) -> IO ()
loop socket sendResponse reportError =
processScannerResult (C.More (C.scan D.response))
where
processScannerResult =
\case
C.More consume -> do
receivingResult <- A.receive socket (shiftL 2 12)
case receivingResult of
Right bytes ->
if B.null bytes
then reportError "Connection interrupted"
else processScannerResult (consume bytes)
Left msg ->
reportError msg
C.Done remainders responseMaybe -> do
traverse_ sendResponse responseMaybe
if B.null remainders
then processScannerResult (C.More (C.scan D.response))
else processScannerResult (C.scan D.response remainders)
C.Fail remainders message -> do
reportError (fromString message)