Retrieving error status from Haskell MongoDB driver -
i have mongodb 1 collection user
contains unique index on email
:
import data.bson (value (int32)) import database.mongodb (index (..), createindex, (=:)) createindex $ index "user" [ "email" =: int32 1 ] "email" true false
i have written function inserts new user if email address not in use, , should fail if email address taken:
import data.bson (value (objid)) import database.mongodb (action, objectid, (=:)) import qualified database.mongodb m (insert) data user = user { email :: text , firstname :: text , lastname :: text } deriving show data mongoentity = mongoentity objectid createifnotexists :: user -> action handler (either text (mongoentity user)) createifnotexists (user@user {..}) = value <- m.insert "user" [ "email" =: email , "firstname" =: firstname , "lastname" =: lastname ] case value of objid objectid -> return (right $ mongoentity objectid user) _ -> return $ left "no document"
i detect errors throw m.insert
(such duplicate key) , return error text
message.
since m.insert
runs in action
monad, assume sets error status if fails, can't figure out how retrieve it. assume need like
error <- geterrorstatus -- or whatever called
immediately after value <- m.insert ...
line , test error in case ... of
expression.
by way, tried writing createifnotexists
using findandmodify
couldn't capture failure either.
i've never used module, reading documentation, best think of :
change type createifnotexists
createifnotexists :: monadio m => user -> action m (either string (mongoentity user))
use catchjust
control.exception.base
. author seems discourage usage of control.monad.error.class
.
main :: io () main = pipe <- connect (host "127.0.0.1") let user = user "jd@bar.baz" "john" "doe" eitherentity <- catchjust writefailureerrorstr (access pipe master "user" $ createifnotexists user) (return . left) close pipe writefailureerrorstr :: failure -> maybe string writefailureerrorstr (writefailure _err str) = str writefailureerrorstr _other = nothing
you want check _err
code value too, since there other reasons writefailure
.
my understanding of documentation is not possible handle errors out of io.
i'm confused way of doing think i'm wrong. please show me more elegant way if there one.
more generally, think checking existence try , fail not nice. i'd rather find request , insert if no result.
Comments
Post a Comment