module Text.RDF.RDF4H.ParserUtils(
_parseURL, justTriples,
Parser(..)
) where
import Data.RDF.Types
import Network.URI
import Network.HTTP
import Data.Char (intToDigit)
import Data.Text.Encoding (decodeUtf8)
import qualified Data.ByteString.Char8 as B
import qualified Data.Text as T
import Data.Maybe (fromMaybe)
data Parser = Parsec | Attoparsec
errResult :: String -> Either ParseFailure (RDF rdfImpl)
errResult msg = Left (ParseFailure msg)
justTriples :: [Maybe Triple] -> [Triple]
justTriples = map (fromMaybe (error "ParserUtils.justTriples")) .
filter (/= Nothing)
_parseURL :: (T.Text -> Either ParseFailure (RDF rdfImpl)) -> String -> IO (Either ParseFailure (RDF rdfImpl))
_parseURL parseFunc url =
maybe
(return (Left (ParseFailure $ "Unable to parse URL: " ++ url)))
doParse
(parseURI url)
where
showRspCode (a, b, c) = map intToDigit [a, b, c]
httpError resp = showRspCode (rspCode resp) ++ " " ++ rspReason resp
doParse url' =
simpleHTTP (request url') >>= \resp ->
case resp of
(Left e) -> return (errResult $ "couldn't retrieve from URL: " ++ show url' ++ " [" ++ show e ++ "]")
(Right res) -> case rspCode res of
(2, 0, 0) -> return $ parseFunc (decodeUtf8 (rspBody res))
_ -> return (errResult $ "couldn't retrieve from URL: " ++ httpError res)
request :: URI -> HTTPRequest B.ByteString
request uri = Request { rqURI = uri,
rqMethod = GET,
rqHeaders = [Header HdrConnection "close"],
rqBody = B.empty }