module Web.Slack
( Cli(..)
, mkCli
, run
, mkManager
)
where
import Data.Proxy (Proxy(..))
import GHC.Generics (Generic)
import qualified Generics.SOP (Generic)
import Network.HTTP.Client (Manager, newManager)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Servant.API
import Servant.Client
import Servant.Client.Generic
import qualified Web.Slack.Api as Api
import qualified Web.Slack.Auth as Auth
import qualified Web.Slack.Channel as Channel
import qualified Web.Slack.Chat as Chat
import Control.Monad.IO.Class
type Api =
"api.test"
:> ReqBody '[FormUrlEncoded] Api.TestReq
:> Post '[JSON] Api.TestRsp
:<|>
"auth.test"
:> ReqBody '[FormUrlEncoded] Auth.TestReq
:> Post '[JSON] Auth.TestRsp
:<|>
"channels.create"
:> ReqBody '[FormUrlEncoded] Channel.CreateReq
:> Post '[JSON] Channel.CreateRsp
:<|>
"chat.postMessage"
:> ReqBody '[FormUrlEncoded] Chat.PostMsgReq
:> Post '[JSON] Chat.PostMsgRsp
data Cli =
Cli
{
apiTest
:: Api.TestReq
-> ClientM Api.TestRsp
, authTest
:: Auth.TestReq
-> ClientM Auth.TestRsp
, channelsCreate
:: Channel.CreateReq
-> ClientM Channel.CreateRsp
, chatPostMessage
:: Chat.PostMsgReq
-> ClientM Chat.PostMsgRsp
}
deriving (Generic)
instance Generics.SOP.Generic Cli
instance (Client Api ~ cli) => ClientLike cli Cli
mkCli :: Cli
mkCli =
mkClient (client (Proxy :: Proxy Api))
run
:: MonadIO m
=> Manager
-> ClientM a
-> m (Either ServantError a)
run manager =
let
baseUrl =
BaseUrl Https "slack.com" 443 "/api"
in
liftIO . flip runClientM (ClientEnv manager baseUrl)
mkManager :: IO Manager
mkManager =
newManager tlsManagerSettings