module Hasura.SQL.Tag
  ( BackendTag (..),
    HasTag (..),
    reify,
  )
where

import Hasura.SQL.Backend

-- | A singleton-like GADT that associates a tag to each backend.
data BackendTag (b :: BackendType) where
  PostgresVanillaTag :: BackendTag ('Postgres 'Vanilla)
  PostgresCitusTag :: BackendTag ('Postgres 'Citus)
  PostgresCockroachTag :: BackendTag ('Postgres 'Cockroach)
  MSSQLTag :: BackendTag 'MSSQL
  BigQueryTag :: BackendTag 'BigQuery
  MySQLTag :: BackendTag 'MySQL
  DataConnectorTag :: BackendTag 'DataConnector

-- | This class describes how to get a tag for a given type.
-- We use it in AnyBackend: `case backendTag @b of`...
class HasTag (b :: BackendType) where
  backendTag :: BackendTag b

instance HasTag ('Postgres 'Vanilla) where
  backendTag :: BackendTag ('Postgres 'Vanilla)
backendTag = BackendTag ('Postgres 'Vanilla)
PostgresVanillaTag

instance HasTag ('Postgres 'Citus) where
  backendTag :: BackendTag ('Postgres 'Citus)
backendTag = BackendTag ('Postgres 'Citus)
PostgresCitusTag

instance HasTag ('Postgres 'Cockroach) where
  backendTag :: BackendTag ('Postgres 'Cockroach)
backendTag = BackendTag ('Postgres 'Cockroach)
PostgresCockroachTag

instance HasTag 'MSSQL where
  backendTag :: BackendTag 'MSSQL
backendTag = BackendTag 'MSSQL
MSSQLTag

instance HasTag 'BigQuery where
  backendTag :: BackendTag 'BigQuery
backendTag = BackendTag 'BigQuery
BigQueryTag

instance HasTag 'MySQL where
  backendTag :: BackendTag 'MySQL
backendTag = BackendTag 'MySQL
MySQLTag

instance HasTag 'DataConnector where
  backendTag :: BackendTag 'DataConnector
backendTag = BackendTag 'DataConnector
DataConnectorTag

-- | How to convert back from a tag to a runtime value.
reify :: BackendTag b -> BackendType
reify :: BackendTag b -> BackendType
reify BackendTag b
PostgresVanillaTag = PostgresKind -> BackendType
Postgres PostgresKind
Vanilla
reify BackendTag b
PostgresCitusTag = PostgresKind -> BackendType
Postgres PostgresKind
Citus
reify BackendTag b
PostgresCockroachTag = PostgresKind -> BackendType
Postgres PostgresKind
Cockroach
reify BackendTag b
MSSQLTag = BackendType
MSSQL
reify BackendTag b
BigQueryTag = BackendType
BigQuery
reify BackendTag b
MySQLTag = BackendType
MySQL
reify BackendTag b
DataConnectorTag = BackendType
DataConnector