{-# LANGUAGE OverloadedStrings #-}

module Database.Bolt.Protocol.Ver1
 ( init
 , exec
 , AuthToken(..)
 , open
 , Transaction
 , runTransaction
 , cypher
 , object
 , (#=)
 , (#:)
 , (#:?)
 ) where

import           Control.Monad
import           Prelude                                 hiding (init)

import           Database.Bolt.Exception
import           Database.Bolt.Protocol.Ver1.Message     (AuthToken (..))
import           Database.Bolt.Protocol.Ver1.Request     (exec, init)
import           Database.Bolt.Protocol.Ver1.Transaction (Transaction, cypher, runTransaction)
import           Database.Bolt.Protocol.Ver1.Types
import           Database.Bolt.Transport

useragent :: UserAgent
useragent = "haskell-bolt/0.0"

open :: Transport t => (a -> IO t) -> a -> AuthToken -> IO t
open c a auth = do
    conn <- c a
    agreed <- handshake conn (OfferProtocols 1 noProto noProto noProto)
    unless (agreed == 1) $
        protocolErr "Can't negotiate protocol version"
    init conn useragent auth
    return conn