packages feed

postgrest-8.0.0: src/PostgREST/DbStructure/Identifiers.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}

module PostgREST.DbStructure.Identifiers
  ( QualifiedIdentifier(..)
  , Schema
  , TableName
  , FieldName
  , toQi
  ) where

import qualified Data.Aeson as JSON
import qualified Data.Text  as T
import qualified GHC.Show

import Protolude


-- | Represents a pg identifier with a prepended schema name "schema.table".
-- When qiSchema is "", the schema is defined by the pg search_path.
data QualifiedIdentifier = QualifiedIdentifier
  { qiSchema :: Schema
  , qiName   :: TableName
  }
  deriving (Eq, Ord, Generic, JSON.ToJSON, JSON.ToJSONKey)

instance Hashable QualifiedIdentifier

instance Show QualifiedIdentifier where
  show (QualifiedIdentifier s i) =
    (if T.null s then mempty else toS s <> ".") <> toS i

-- TODO: Handle a case where the QI comes like this: "my.fav.schema"."my.identifier"
-- Right now it only handles the schema.identifier case
toQi :: Text -> QualifiedIdentifier
toQi txt = case T.drop 1 <$> T.breakOn "." txt of
  (i, "") -> QualifiedIdentifier mempty i
  (s, i)  -> QualifiedIdentifier s i

type Schema = Text
type TableName = Text
type FieldName = Text