module Network.Metrics.Internal (
Handle(..)
, open
, close
, emit
) where
import Control.Monad (unless)
import Network.Socket hiding (send)
import Network.Socket.ByteString.Lazy (send)
import qualified Data.ByteString.Lazy.Char8 as BL
data Handle = Handle Socket SockAddr deriving (Show)
open :: SocketType -> String -> String -> IO Handle
open typ host port = do
(addr:_) <- getAddrInfo Nothing (Just host) (Just port)
sock <- socket (addrFamily addr) typ defaultProtocol
return $ Handle sock (addrAddress addr)
close :: Handle -> IO ()
close (Handle sock _) = sClose sock
emit :: BL.ByteString -> Handle -> IO ()
emit bstr (Handle sock addr) | BL.null bstr = return ()
| otherwise = do
sIsConnected sock >>= \b -> unless b $ connect sock addr
_ <- send sock bstr
return ()