{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.Aviation.Stratux.HTTP(
getWith
, getStatusWith
, getStatus
, getStatus'
, getSettingsWith
, getSettings
, getSettings'
, setSettings
, getSituation
, getSituation'
) where
import Control.Applicative((<$>))
import Control.Monad((>>=))
import Control.Monad.Trans.Except(ExceptT(ExceptT))
import Data.Aeson(eitherDecode, eitherDecode', encode)
import Data.Aviation.Stratux.Types.Status(Status)
import Data.Aviation.Stratux.Types.Settings(Settings, SettingsSet)
import Data.Aviation.Stratux.Types.Situation(Situation)
import qualified Data.ByteString.Lazy.UTF8 as BLU
import Data.Either(Either)
import Data.Maybe(Maybe(Just))
import Data.String(String)
import Network.HTTP(RequestMethod(GET, POST), simpleHTTP, mkRequest, getResponseBody, setRequestBody)
import Network.TCP(HStream)
import Network.URI(URI(URI), URIAuth)
import System.IO(IO)
httpGet ::
HStream b =>
URIAuth
-> String
-> String
-> String
-> IO b
httpGet auth path query fragment =
simpleHTTP (mkRequest GET (URI "http:" (Just auth) path query fragment)) >>= getResponseBody
getWith ::
HStream x =>
String
-> (x -> Either e a)
-> URIAuth
-> String
-> String
-> ExceptT e IO a
getWith path d auth query fragment =
ExceptT (d <$> httpGet auth path query fragment)
getStatusWith ::
HStream x =>
(x -> Either e Status)
-> URIAuth
-> String
-> String
-> ExceptT e IO Status
getStatusWith =
getWith "/getStatus"
getStatus ::
URIAuth
-> String
-> String
-> ExceptT String IO Status
getStatus =
getStatusWith eitherDecode
getStatus' ::
URIAuth
-> String
-> String
-> ExceptT String IO Status
getStatus' =
getStatusWith eitherDecode'
getSettingsWith ::
HStream x =>
(x -> Either e Settings)
-> URIAuth
-> String
-> String
-> ExceptT e IO Settings
getSettingsWith =
getWith "/getSettings"
getSettings ::
URIAuth
-> String
-> String
-> ExceptT String IO Settings
getSettings =
getSettingsWith eitherDecode
getSettings' ::
URIAuth
-> String
-> String
-> ExceptT String IO Settings
getSettings' =
getSettingsWith eitherDecode'
httpPost ::
String
-> String
-> URIAuth
-> String
-> String
-> String
-> IO String
httpPost typ body auth path query fragment =
simpleHTTP (setRequestBody (mkRequest POST (URI "http:" (Just auth) path query fragment)) (typ, body)) >>= getResponseBody
setSettings ::
SettingsSet
-> URIAuth
-> String
-> String
-> IO String
setSettings s auth =
httpPost "application/json" (BLU.toString (encode s)) auth "/setSettings"
getSituationWith ::
HStream x =>
(x -> Either e Situation)
-> URIAuth
-> String
-> String
-> ExceptT e IO Situation
getSituationWith =
getWith "/getSituation"
getSituation ::
URIAuth
-> String
-> String
-> ExceptT String IO Situation
getSituation =
getSituationWith eitherDecode
getSituation' ::
URIAuth
-> String
-> String
-> ExceptT String IO Situation
getSituation' =
getSituationWith eitherDecode'