module Database.Bolt.Connection.Instances where
import Database.Bolt.Connection.Type
import Database.Bolt.Value.Helpers
import Database.Bolt.Value.Type
import Data.Map.Strict (Map (..), fromList, empty)
import Data.Text (Text)
instance Structable Request where
toStructure (RequestInit agent token) = Structure sigInit [T agent, M $ tokenMap token]
toStructure (RequestRun stmt params) = Structure sigRun [T stmt, M params]
toStructure RequestReset = Structure sigReset []
toStructure RequestAckFailure = Structure sigAFail []
toStructure RequestPullAll = Structure sigPAll []
toStructure RequestDiscardAll = Structure sigDAll []
fromStructure = undefined
instance Structable Response where
toStructure = undefined
fromStructure (Structure sig fields) | sig == sigSucc = ResponseSuccess <$> extractMap (head fields)
| sig == sigRecs = return $ ResponseRecord (removeExtList fields)
| sig == sigIgn = ResponseIgnored <$> extractMap (head fields)
| sig == sigFail = ResponseFailure <$> extractMap (head fields)
| otherwise = fail "Not a Response value"
where removeExtList :: [Value] -> [Value]
removeExtList [L x] = x
removeExtList _ = error "Record must contain only on value list"
isSuccess :: Response -> Bool
isSuccess (ResponseSuccess _) = True
isSuccess _ = False
isFailure :: Response -> Bool
isFailure (ResponseFailure _) = True
isFailure _ = False
isIgnored :: Response -> Bool
isIgnored (ResponseIgnored _) = True
isIgnored _ = False
isRecord :: Response -> Bool
isRecord (ResponseRecord _) = True
isRecord _ = False
createInit :: BoltCfg -> Request
createInit bcfg = RequestInit (userAgent bcfg) (tokenOf bcfg)
createRun :: Text -> Request
createRun stmt = RequestRun stmt empty
tokenOf :: BoltCfg -> AuthToken
tokenOf bcfg = AuthToken { scheme = "basic"
, principal = user bcfg
, credentials = password bcfg
}
tokenMap :: AuthToken -> Map Text Value
tokenMap at = fromList [ ("scheme", T $ scheme at)
, ("principal", T $ principal at)
, ("credentials", T $ credentials at)
]
extractMap :: Monad m => Value -> m (Map Text Value)
extractMap (M mp) = return mp
extractMap _ = fail "Not a Dict value"