graphql-engine/server/src-lib/Hasura/Backends/DataConnector/Adapter/Backend.hs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

109 lines
5.0 KiB
Haskell
Raw Normal View History

{-# OPTIONS_GHC -fno-warn-orphans #-}
module Hasura.Backends.DataConnector.Adapter.Backend () where
--------------------------------------------------------------------------------
import Data.Aeson qualified as J (Value)
import Hasura.Backends.DataConnector.Adapter.Types qualified as Adapter
import Hasura.Backends.DataConnector.IR.Column qualified as IR.C
import Hasura.Backends.DataConnector.IR.Expression qualified as IR.E
import Hasura.Backends.DataConnector.IR.Function qualified as IR.F
import Hasura.Backends.DataConnector.IR.Name qualified as IR.N
import Hasura.Backends.DataConnector.IR.OrderBy qualified as IR.O
import Hasura.Backends.DataConnector.IR.Scalar.Type qualified as IR.S.T
import Hasura.Backends.DataConnector.IR.Scalar.Value qualified as IR.S.V
import Hasura.Backends.DataConnector.IR.Table as IR.T
import Hasura.Base.Error (Code (ValidationFailed), QErr, throw400)
import Hasura.Prelude
import Hasura.RQL.Types.Backend (Backend (..), XDisable)
import Hasura.RQL.Types.Common as RQL (boolScalar, floatScalar, stringScalar)
import Hasura.SQL.Backend (BackendType (DataConnector))
import Language.GraphQL.Draft.Syntax qualified as G
--------------------------------------------------------------------------------
-- | An alias for '()' indicating that a particular associated type has not yet
-- been implemented for the 'DataConnector' backend.
--
-- '()' is used (rather than a type with an empty data constructor) because it
-- comes with many of the instances that these associated types require.
--
-- This alias should /not/ be exported from this module, and it's only defined
-- for clarity.
type Unimplemented = ()
instance Backend 'DataConnector where
type BackendConfig 'DataConnector = Adapter.DataConnectorBackendConfig
type SourceConfig 'DataConnector = Adapter.SourceConfig
type SourceConnConfiguration 'DataConnector = Adapter.ConnSourceConfig
type TableName 'DataConnector = IR.T.Name
type FunctionName 'DataConnector = IR.F.Name
type RawFunctionInfo 'DataConnector = XDisable
type FunctionArgType 'DataConnector = XDisable
type ConstraintName 'DataConnector = Unimplemented
type BasicOrderType 'DataConnector = IR.O.OrderType
type NullsOrderType 'DataConnector = Unimplemented
type CountType 'DataConnector = Unimplemented
type Column 'DataConnector = IR.C.Name
type ScalarValue 'DataConnector = IR.S.V.Value
type ScalarType 'DataConnector = IR.S.T.Type
type SQLExpression 'DataConnector = IR.E.Expression
type ScalarSelectionArguments 'DataConnector = Void
type BooleanOperators 'DataConnector = Const XDisable
type ExtraTableMetadata 'DataConnector = Unimplemented
type ComputedFieldDefinition 'DataConnector = Unimplemented
type XComputedField 'DataConnector = XDisable
type XRelay 'DataConnector = XDisable
type XNodesAgg 'DataConnector = XDisable
type XNestedInserts 'DataConnector = XDisable
type XStreamingSubscription 'DataConnector = XDisable
functionArgScalarType :: FunctionArgType 'DataConnector -> ScalarType 'DataConnector
functionArgScalarType = error "functionArgScalarType: not implemented for the Data Connector backend."
isComparableType :: ScalarType 'DataConnector -> Bool
isComparableType = isNumType @'DataConnector
isNumType :: ScalarType 'DataConnector -> Bool
isNumType IR.S.T.Number = True
isNumType _ = False
textToScalarValue :: Maybe Text -> ScalarValue 'DataConnector
textToScalarValue = error "textToScalarValue: not implemented for the Data Connector backend."
parseScalarValue :: ScalarType 'DataConnector -> J.Value -> Either QErr (ScalarValue 'DataConnector)
parseScalarValue = error "parseScalarValue: not implemented for the Data Connector backend."
scalarValueToJSON :: ScalarValue 'DataConnector -> J.Value
scalarValueToJSON = error "scalarValueToJSON: not implemented for the Data Connector backend."
functionToTable :: FunctionName 'DataConnector -> TableName 'DataConnector
functionToTable = error "functionToTable: not implemented for the Data Connector backend."
computedFieldFunction :: ComputedFieldDefinition 'DataConnector -> FunctionName 'DataConnector
computedFieldFunction = error "computedFieldFunction: not implemented for the Data Connector backend"
-- phil said this was cursed
tableToFunction :: TableName 'DataConnector -> FunctionName 'DataConnector
tableToFunction = coerce
tableGraphQLName :: TableName 'DataConnector -> Either QErr G.Name
tableGraphQLName name =
G.mkName (IR.N.unName name)
`onNothing` throw400 ValidationFailed ("TableName " <> IR.N.unName name <> " is not a valid GraphQL identifier")
functionGraphQLName :: FunctionName 'DataConnector -> Either QErr G.Name
functionGraphQLName = error "functionGraphQLName: not implemented for the Data Connector backend."
scalarTypeGraphQLName :: ScalarType 'DataConnector -> Either QErr G.Name
scalarTypeGraphQLName = \case
IR.S.T.String -> pure stringScalar
IR.S.T.Number -> pure floatScalar
IR.S.T.Bool -> pure boolScalar
snakeCaseTableName :: TableName 'DataConnector -> Text
snakeCaseTableName = IR.N.unName