module Database.TinkerPop.Types where
import Data.Text hiding (drop, toLower)
import Data.Char (toLower)
import qualified Data.Map.Strict as M
import Data.Aeson (Object, Value)
import Data.Aeson.TH
import Control.Lens
import qualified Network.WebSockets as WS
import qualified Control.Concurrent.STM.TChan as S
import qualified Control.Concurrent.STM.TVar as S
type Gremlin = Text
type Binding = Object
data RequestArgs = RequestArgs {
_requestArgsGremlin :: Text
, _requestArgsBindings :: Maybe Binding
, _requestArgsLanguage :: Text
, _requestArgsBatchSize :: Maybe Int
}
$(deriveJSON defaultOptions{fieldLabelModifier = (\(x:xs) -> (toLower x):xs).(drop 12)} ''RequestArgs)
makeFields ''RequestArgs
data RequestMessage = RequestMessage {
_requestMessageRequestId :: Text
, _requestMessageOp :: Text
, _requestMessageProcessor :: Text
, _requestMessageArgs :: RequestArgs
}
$(deriveJSON defaultOptions{fieldLabelModifier = (\(x:xs) -> (toLower x):xs).(drop 15)} ''RequestMessage)
makeFields ''RequestMessage
data ResponseStatus = ResponseStatus {
_responseStatusMessage :: Text
, _responseStatusCode :: Int
, _responseStatusAttributes :: Object
} deriving (Show)
makeFields ''ResponseStatus
$(deriveJSON defaultOptions {fieldLabelModifier = (\(x:xs) -> (toLower x):xs).(drop 15)} ''ResponseStatus)
data ResponseResult = ResponseResult {
_responseResultData' :: Maybe [Value]
, _responseResultMeta :: Object
} deriving (Show)
makeFields ''ResponseResult
$(deriveJSON defaultOptions {fieldLabelModifier = \f -> if f == "_responseResultData'" then "data" else (\(x:xs) -> (toLower x):xs) (drop 15 f)} ''ResponseResult)
data ResponseMessage = ResponseMessage {
_responseMessageRequestId :: Text
, _responseMessageStatus :: ResponseStatus
, _responseMessageResult :: ResponseResult
} deriving (Show)
$(deriveJSON defaultOptions{fieldLabelModifier = (\(x:xs) -> (toLower x):xs).(drop 16)} ''ResponseMessage)
makeFields ''ResponseMessage
data Connection = Connection {
_connectionSocket :: WS.Connection
, _connectionChans :: S.TVar (M.Map Text (S.TChan (Either String ResponseMessage)))
}
makeFields ''Connection