{-# 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