packages feed

couchdb-conduit-0.1.0.0: src/Database/CouchDB/Conduit/Internal/Parser.hs

{-# LANGUAGE OverloadedStrings #-}

module Database.CouchDB.Conduit.Internal.Parser where

import              Data.Conduit
import qualified    Data.ByteString.UTF8 as BU8
import qualified    Data.Text as T
import qualified    Data.Text.Encoding as TE
import qualified    Data.HashMap.Lazy as M
import qualified    Data.Aeson as A

import              Database.CouchDB.Conduit

--valToRev :: A.Value -> Either CouchError Revision
--valToRev (A.Object o) = case M.lookup "rev" o of
--    (Just (A.String r)) -> Right $ TE.encodeUtf8 r
--    _  -> Left $ CouchError Nothing "unable to find revision"  
--valToRev _ = Left $ CouchError Nothing "Couch DB did not return an object"

extractRev :: ResourceIO m => A.Value -> m Revision
extractRev o = do
    A.String r <- extractField "rev" o
    return $ TE.encodeUtf8 r

-- | Extract single field
extractField :: ResourceIO m =>
           T.Text -> A.Value -> m A.Value
extractField s (A.Object o) = case M.lookup s o of
    (Just r) -> return r
    _  -> resourceThrow $ CouchError Nothing $
            "unable to find field" ++ (BU8.toString . TE.encodeUtf8 $ s)  
extractField _ _ = resourceThrow $ CouchError Nothing 
        "Couch DB did not return an object"

-- | Convert to type with given convertor
jsonToTypeWith :: ResourceIO m =>
                (A.Value -> A.Result a) 
             -> A.Value 
             -> m a
jsonToTypeWith f j = case f j of
        A.Error e -> resourceThrow $ CouchError Nothing 
                        ("Error parsing json: " ++ e)
        A.Success o -> return o