module Hasql.Codecs.Vocab.QualifiedTypeName
  ( QualifiedTypeName (..),
    fromNameTuple,
    toNameTuple,
  )
where

import Hasql.Platform.Prelude

-- |
-- A Postgres type identified by name: an optional schema together with a
-- required type name.
--
-- A 'Nothing' schema means the name is unqualified and is resolved via the
-- server's search path.
--
-- Used as the key under which a type's OIDs are resolved and cached.
data QualifiedTypeName = QualifiedTypeName
  { QualifiedTypeName -> Maybe Text
schema :: Maybe Text,
    QualifiedTypeName -> Text
name :: Text
  }
  deriving stock (QualifiedTypeName -> QualifiedTypeName -> Bool
(QualifiedTypeName -> QualifiedTypeName -> Bool)
-> (QualifiedTypeName -> QualifiedTypeName -> Bool)
-> Eq QualifiedTypeName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: QualifiedTypeName -> QualifiedTypeName -> Bool
== :: QualifiedTypeName -> QualifiedTypeName -> Bool
$c/= :: QualifiedTypeName -> QualifiedTypeName -> Bool
/= :: QualifiedTypeName -> QualifiedTypeName -> Bool
Eq, Eq QualifiedTypeName
Eq QualifiedTypeName =>
(QualifiedTypeName -> QualifiedTypeName -> Ordering)
-> (QualifiedTypeName -> QualifiedTypeName -> Bool)
-> (QualifiedTypeName -> QualifiedTypeName -> Bool)
-> (QualifiedTypeName -> QualifiedTypeName -> Bool)
-> (QualifiedTypeName -> QualifiedTypeName -> Bool)
-> (QualifiedTypeName -> QualifiedTypeName -> QualifiedTypeName)
-> (QualifiedTypeName -> QualifiedTypeName -> QualifiedTypeName)
-> Ord QualifiedTypeName
QualifiedTypeName -> QualifiedTypeName -> Bool
QualifiedTypeName -> QualifiedTypeName -> Ordering
QualifiedTypeName -> QualifiedTypeName -> QualifiedTypeName
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: QualifiedTypeName -> QualifiedTypeName -> Ordering
compare :: QualifiedTypeName -> QualifiedTypeName -> Ordering
$c< :: QualifiedTypeName -> QualifiedTypeName -> Bool
< :: QualifiedTypeName -> QualifiedTypeName -> Bool
$c<= :: QualifiedTypeName -> QualifiedTypeName -> Bool
<= :: QualifiedTypeName -> QualifiedTypeName -> Bool
$c> :: QualifiedTypeName -> QualifiedTypeName -> Bool
> :: QualifiedTypeName -> QualifiedTypeName -> Bool
$c>= :: QualifiedTypeName -> QualifiedTypeName -> Bool
>= :: QualifiedTypeName -> QualifiedTypeName -> Bool
$cmax :: QualifiedTypeName -> QualifiedTypeName -> QualifiedTypeName
max :: QualifiedTypeName -> QualifiedTypeName -> QualifiedTypeName
$cmin :: QualifiedTypeName -> QualifiedTypeName -> QualifiedTypeName
min :: QualifiedTypeName -> QualifiedTypeName -> QualifiedTypeName
Ord, Int -> QualifiedTypeName -> ShowS
[QualifiedTypeName] -> ShowS
QualifiedTypeName -> String
(Int -> QualifiedTypeName -> ShowS)
-> (QualifiedTypeName -> String)
-> ([QualifiedTypeName] -> ShowS)
-> Show QualifiedTypeName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> QualifiedTypeName -> ShowS
showsPrec :: Int -> QualifiedTypeName -> ShowS
$cshow :: QualifiedTypeName -> String
show :: QualifiedTypeName -> String
$cshowList :: [QualifiedTypeName] -> ShowS
showList :: [QualifiedTypeName] -> ShowS
Show, (forall x. QualifiedTypeName -> Rep QualifiedTypeName x)
-> (forall x. Rep QualifiedTypeName x -> QualifiedTypeName)
-> Generic QualifiedTypeName
forall x. Rep QualifiedTypeName x -> QualifiedTypeName
forall x. QualifiedTypeName -> Rep QualifiedTypeName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. QualifiedTypeName -> Rep QualifiedTypeName x
from :: forall x. QualifiedTypeName -> Rep QualifiedTypeName x
$cto :: forall x. Rep QualifiedTypeName x -> QualifiedTypeName
to :: forall x. Rep QualifiedTypeName x -> QualifiedTypeName
Generic)

instance Hashable QualifiedTypeName

-- | An unqualified name constructor for convenience.
instance IsString QualifiedTypeName where
  fromString :: String -> QualifiedTypeName
fromString = Maybe Text -> Text -> QualifiedTypeName
QualifiedTypeName Maybe Text
forall a. Maybe a
Nothing (Text -> QualifiedTypeName)
-> (String -> Text) -> String -> QualifiedTypeName
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> Text
forall a. IsString a => String -> a
fromString

-- |
-- Convert from the legacy @(schema, name)@ tuple representation.
--
-- Used at public-API boundaries (e.g. the @custom@ codecs and error types)
-- where the tuple is still exposed but internals operate on 'QualifiedTypeName'.
fromNameTuple :: (Maybe Text, Text) -> QualifiedTypeName
fromNameTuple :: (Maybe Text, Text) -> QualifiedTypeName
fromNameTuple (Maybe Text
schema, Text
name) = Maybe Text -> Text -> QualifiedTypeName
QualifiedTypeName Maybe Text
schema Text
name

-- |
-- Convert to the legacy @(schema, name)@ tuple representation.
--
-- See 'fromNameTuple'.
toNameTuple :: QualifiedTypeName -> (Maybe Text, Text)
toNameTuple :: QualifiedTypeName -> (Maybe Text, Text)
toNameTuple (QualifiedTypeName Maybe Text
schema Text
name) = (Maybe Text
schema, Text
name)