module Web.OpenWeatherMap.Client
( getWeather
, getForecast
) where
import Network.HTTP.Client.TLS (newTlsManager)
import Servant.Client
( BaseUrl(BaseUrl)
, ClientEnv
, ClientError
, Scheme(Https)
, mkClientEnv
, runClientM
)
import qualified Web.OpenWeatherMap.API as API
import Web.OpenWeatherMap.Types.CurrentWeather (CurrentWeather)
import Web.OpenWeatherMap.Types.ForecastWeather (ForecastWeather)
import Web.OpenWeatherMap.Types.Location (Location)
getWeather ::
String
-> Location
-> IO (Either ClientError CurrentWeather)
getWeather :: String -> Location -> IO (Either ClientError CurrentWeather)
getWeather String
appid Location
loc = IO ClientEnv
defaultEnv forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM (String -> Location -> ClientM CurrentWeather
API.currentWeather String
appid Location
loc)
getForecast ::
String
-> Location
-> IO (Either ClientError ForecastWeather)
getForecast :: String -> Location -> IO (Either ClientError ForecastWeather)
getForecast String
appid Location
loc =
IO ClientEnv
defaultEnv forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM (String -> Location -> ClientM ForecastWeather
API.forecastWeather String
appid Location
loc)
defaultEnv :: IO ClientEnv
defaultEnv :: IO ClientEnv
defaultEnv = do
Manager
manager <- forall (m :: * -> *). MonadIO m => m Manager
newTlsManager
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
baseUrl
baseUrl :: BaseUrl
baseUrl :: BaseUrl
baseUrl = Scheme -> String -> Int -> String -> BaseUrl
BaseUrl Scheme
Https String
"api.openweathermap.org" Int
443 String
"/data/2.5"