packages feed

sakuraio-platform-0.1.0.0: app/DemoHttpClient.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import System.Environment (getArgs)
import qualified Network.HTTP.Client as HC
import Network.HTTP.Client.TLS (tlsManagerSettings)
import qualified Data.ByteString.Lazy as LBS

import Data.Monoid ((<>))
import qualified Data.Aeson as AE

import Network.SakuraIO.Platform.Message


main :: IO ()
main = do
  httpManager <- HC.newManager tlsManagerSettings
  ep:mid:ch:tname:value:_ <- getArgs
  
  case tname of
    xs | elem xs ["i","I","l","L","f","d","b"] ->
      let msg = case tname of
            "i" -> ICChannels mid [ICChannel (read ch) (CVInt32  (read value))]
            "I" -> ICChannels mid [ICChannel (read ch) (CVWord32 (read value))]
            "l" -> ICChannels mid [ICChannel (read ch) (CVInt64  (read value))]
            "L" -> ICChannels mid [ICChannel (read ch) (CVWord64 (read value))]
            "f" -> ICChannels mid [ICChannel (read ch) (CVFloat  (read value))]
            "d" -> ICChannels mid [ICChannel (read ch) (CVDouble (read value))]
            "b" -> ICChannels mid [ICChannel (read ch) (CVBytes  (read value))] -- [TODO]
      in LBS.putStr =<< sendMessage httpManager ep msg
    
    _ -> do
      putStrLn "sakuraio-platform-demo-http-client"
      putStrLn ""
      putStrLn "Usage: sakuraio-platform-demo-http-client-exe [endpoint] [module] [channel] [type] [value]"
      putStrLn ""
      putStrLn "Avaliable type:"
      putStrLn "\ti: signed 32 bit integer"
      putStrLn "\tI: unsigned 32 bit integer"
      putStrLn "\tl: signed 64 bit integer"
      putStrLn "\tL: unsigned 64 bit integer"
      putStrLn "\tf: float"
      putStrLn "\td: double"
      putStrLn "\tb: byte array"


sendMessage :: HC.Manager -> String -> InComingMessage -> IO LBS.ByteString
sendMessage man ep msg = do
  req <- HC.parseRequest $ "https://api.sakura.io/incoming/v1/" <> ep
  let req' = req {HC.method = "POST", HC.requestBody = HC.RequestBodyLBS $ AE.encode msg}
  res <- HC.httpLbs req' man
  return $ HC.responseBody res


-- for repl
sendMessage' :: String -> InComingMessage -> IO LBS.ByteString
sendMessage' ep msg =
  HC.newManager tlsManagerSettings >>= \man -> sendMessage man ep msg