module Web.HackerNews.Client ( getItem ) where
import Data.Aeson hiding (Result)
import Data.Aeson.Parser (value)
import Data.Attoparsec.ByteString (parseOnly)
import Data.Either (rights)
import Data.Monoid ((<>))
import Data.Text (Text)
import qualified Data.Text.Encoding as T
import Network.Http.Client
import OpenSSL (withOpenSSL)
import qualified System.IO.Streams as Streams
getItem
:: FromJSON a
=> Text
-> IO (Maybe a)
getItem url = withOpenSSL $ do
ctx <- baselineContextSSL
con <- openConnectionSSL ctx "hacker-news.firebaseio.com" 443
req <- buildRequest $ do
http GET $ "/v0/" <> T.encodeUtf8 url <> ".json"
setAccept "application/json"
sendRequest con req emptyBody
bytes <- receiveResponse con $ const $ Streams.read
closeConnection con
return $ case bytes of
Nothing -> Nothing
Just bs -> do
let xs = rights [parseOnly value bs, parseOnly json bs]
case xs of
[] -> Nothing
x : _ ->
case fromJSON x of
Success a -> Just a
_ -> Nothing