packages feed

rdf4h-3.1.1: src/Text/RDF/RDF4H/ParserUtils.hs

{-# LANGUAGE ScopedTypeVariables #-}

module Text.RDF.RDF4H.ParserUtils(
  _parseURL,
  Parser(..)
) where

import Data.RDF.Types

import Control.Exception.Lifted
import Network.HTTP.Conduit
import Data.Text.Encoding (decodeUtf8)
import qualified Data.ByteString.Lazy as BS
import qualified Data.Text as T

data Parser = Parsec | Attoparsec

-- | A convenience function for terminating a parse with a parse failure, using
-- the given error message as the message for the failure.
errResult :: String -> Either ParseFailure (RDF rdfImpl)
errResult msg = Left (ParseFailure msg)

_parseURL :: (T.Text -> Either ParseFailure (RDF rdfImpl)) -> String -> IO (Either ParseFailure (RDF rdfImpl))
_parseURL parseFunc url = do
  result <- Control.Exception.Lifted.try $ simpleHttp url
  case result of
    Left (ex::HttpException) ->
      case ex of
        (HttpExceptionRequest _req content) ->
          case content of
            ConnectionTimeout -> do
              return $ errResult "Connection timed out"
            _ -> return $ errResult ("HttpExceptionRequest content: " ++ show content)
        (InvalidUrlException{}) ->
          return $ errResult "Invalid URL exception"
    Right bs -> do
      let s = decodeUtf8 $ BS.toStrict bs
      return (parseFunc s)