{- |
Copyright : Flipstone Technology Partners 2023
License   : MIT
Stability : Stable

@since 1.0.0.0
-}
module Orville.PostgreSQL.Internal.FieldName
  ( FieldName
  , stringToFieldName
  , fieldNameToString
  , fieldNameToColumnName
  , fieldNameToByteString
  , byteStringToFieldName
  ) where

import qualified Data.ByteString.Char8 as B8

import qualified Orville.PostgreSQL.Expr as Expr

{- |
  A simple type to represent the name of a field.

@since 1.0.0.0
-}
newtype FieldName
  = FieldName B8.ByteString
  deriving (FieldName -> FieldName -> Bool
(FieldName -> FieldName -> Bool)
-> (FieldName -> FieldName -> Bool) -> Eq FieldName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FieldName -> FieldName -> Bool
== :: FieldName -> FieldName -> Bool
$c/= :: FieldName -> FieldName -> Bool
/= :: FieldName -> FieldName -> Bool
Eq, Eq FieldName
Eq FieldName
-> (FieldName -> FieldName -> Ordering)
-> (FieldName -> FieldName -> Bool)
-> (FieldName -> FieldName -> Bool)
-> (FieldName -> FieldName -> Bool)
-> (FieldName -> FieldName -> Bool)
-> (FieldName -> FieldName -> FieldName)
-> (FieldName -> FieldName -> FieldName)
-> Ord FieldName
FieldName -> FieldName -> Bool
FieldName -> FieldName -> Ordering
FieldName -> FieldName -> FieldName
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 :: FieldName -> FieldName -> Ordering
compare :: FieldName -> FieldName -> Ordering
$c< :: FieldName -> FieldName -> Bool
< :: FieldName -> FieldName -> Bool
$c<= :: FieldName -> FieldName -> Bool
<= :: FieldName -> FieldName -> Bool
$c> :: FieldName -> FieldName -> Bool
> :: FieldName -> FieldName -> Bool
$c>= :: FieldName -> FieldName -> Bool
>= :: FieldName -> FieldName -> Bool
$cmax :: FieldName -> FieldName -> FieldName
max :: FieldName -> FieldName -> FieldName
$cmin :: FieldName -> FieldName -> FieldName
min :: FieldName -> FieldName -> FieldName
Ord, Int -> FieldName -> ShowS
[FieldName] -> ShowS
FieldName -> String
(Int -> FieldName -> ShowS)
-> (FieldName -> String)
-> ([FieldName] -> ShowS)
-> Show FieldName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FieldName -> ShowS
showsPrec :: Int -> FieldName -> ShowS
$cshow :: FieldName -> String
show :: FieldName -> String
$cshowList :: [FieldName] -> ShowS
showList :: [FieldName] -> ShowS
Show)

{- |
  Convert a field name to a 'Expr.ColumnName' for usage in SQL expressions.
  The field name will be properly quoted and escaped.

@since 1.0.0.0
-}
fieldNameToColumnName :: FieldName -> Expr.ColumnName
fieldNameToColumnName :: FieldName -> ColumnName
fieldNameToColumnName (FieldName ByteString
name) =
  Identifier -> ColumnName
forall name. IdentifierExpression name => Identifier -> name
Expr.fromIdentifier (ByteString -> Identifier
Expr.identifierFromBytes ByteString
name)

{- |
  Constructs a 'FieldName' from a 'String'.

@since 1.0.0.0
-}
stringToFieldName :: String -> FieldName
stringToFieldName :: String -> FieldName
stringToFieldName =
  ByteString -> FieldName
FieldName (ByteString -> FieldName)
-> (String -> ByteString) -> String -> FieldName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
B8.pack

{- |
  Converts a 'FieldName' back to a 'String'.

@since 1.0.0.0
-}
fieldNameToString :: FieldName -> String
fieldNameToString :: FieldName -> String
fieldNameToString =
  ByteString -> String
B8.unpack (ByteString -> String)
-> (FieldName -> ByteString) -> FieldName -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName -> ByteString
fieldNameToByteString

{- |
  Converts a 'FieldName' back to a 'B8.ByteString'.

@since 1.0.0.0
-}
fieldNameToByteString :: FieldName -> B8.ByteString
fieldNameToByteString :: FieldName -> ByteString
fieldNameToByteString (FieldName ByteString
name) =
  ByteString
name

{- |
  Constructs a 'FieldName' from a 'B8.ByteString'.

@since 1.0.0.0
-}
byteStringToFieldName :: B8.ByteString -> FieldName
byteStringToFieldName :: ByteString -> FieldName
byteStringToFieldName = ByteString -> FieldName
FieldName