Extract utility functions

These are later going to be used by the client too
This commit is contained in:
Joscha 2020-02-08 20:46:53 +00:00
parent 1b6dc379fb
commit 4a0c3e13d5
2 changed files with 39 additions and 30 deletions

36
src/Forest/Util.hs Normal file
View file

@ -0,0 +1,36 @@
{-# LANGUAGE OverloadedStrings #-}
module Forest.Util
( withThread
, sendPacket
, receivePacket
, closeWithErrorMessage
) where
import Control.Concurrent.Async
import Data.Aeson
import qualified Data.Text as T
import qualified Network.WebSockets as WS
withThread :: IO () -> IO () -> IO ()
withThread thread main = withAsync thread $ const main
sendPacket :: ToJSON a => WS.Connection -> a -> IO ()
sendPacket conn packet = WS.sendTextData conn $ encode packet
closeWithErrorMessage :: WS.Connection -> T.Text -> IO ()
closeWithErrorMessage conn = WS.sendCloseCode conn 1003
receivePacket :: FromJSON a => WS.Connection -> IO (Maybe a)
receivePacket conn = do
dataMessage <- WS.receiveDataMessage conn
closeOnErrorMessage $ case dataMessage of
WS.Binary _ -> Left "Invalid message format: Binary"
WS.Text bs _ -> case eitherDecode' bs of
Left errorMsg -> Left $ "Invalid packet: " <> T.pack errorMsg
Right packet -> Right packet
where
closeOnErrorMessage :: Either T.Text a -> IO (Maybe a)
closeOnErrorMessage (Right a) = pure $ Just a
closeOnErrorMessage (Left errorMsg) =
Nothing <$ closeWithErrorMessage conn errorMsg