{-# LANGUAGE OverloadedStrings #-}
module Orville.PostgreSQL.Marshall.SyntheticField
( SyntheticField
, syntheticFieldExpression
, syntheticFieldAlias
, syntheticFieldValueFromSqlValue
, syntheticField
, nullableSyntheticField
, prefixSyntheticField
)
where
import qualified Data.ByteString.Char8 as B8
import qualified Orville.PostgreSQL.Expr as Expr
import Orville.PostgreSQL.Marshall.FieldDefinition (FieldName, byteStringToFieldName, fieldNameToByteString, stringToFieldName)
import qualified Orville.PostgreSQL.Raw.SqlValue as SqlValue
data SyntheticField a = SyntheticField
{ forall a. SyntheticField a -> ValueExpression
_syntheticFieldExpression :: Expr.ValueExpression
, forall a. SyntheticField a -> FieldName
_syntheticFieldAlias :: FieldName
, forall a. SyntheticField a -> SqlValue -> Either String a
_syntheticFieldValueFromSqlValue :: SqlValue.SqlValue -> Either String a
}
syntheticFieldExpression :: SyntheticField a -> Expr.ValueExpression
syntheticFieldExpression :: forall a. SyntheticField a -> ValueExpression
syntheticFieldExpression =
SyntheticField a -> ValueExpression
forall a. SyntheticField a -> ValueExpression
_syntheticFieldExpression
syntheticFieldAlias :: SyntheticField a -> FieldName
syntheticFieldAlias :: forall a. SyntheticField a -> FieldName
syntheticFieldAlias =
SyntheticField a -> FieldName
forall a. SyntheticField a -> FieldName
_syntheticFieldAlias
syntheticFieldValueFromSqlValue :: SyntheticField a -> SqlValue.SqlValue -> Either String a
syntheticFieldValueFromSqlValue :: forall a. SyntheticField a -> SqlValue -> Either String a
syntheticFieldValueFromSqlValue =
SyntheticField a -> SqlValue -> Either String a
forall a. SyntheticField a -> SqlValue -> Either String a
_syntheticFieldValueFromSqlValue
syntheticField ::
Expr.ValueExpression ->
String ->
(SqlValue.SqlValue -> Either String a) ->
SyntheticField a
syntheticField :: forall a.
ValueExpression
-> String -> (SqlValue -> Either String a) -> SyntheticField a
syntheticField ValueExpression
expression String
alias SqlValue -> Either String a
fromSqlValue =
SyntheticField
{ _syntheticFieldExpression :: ValueExpression
_syntheticFieldExpression = ValueExpression
expression
, _syntheticFieldAlias :: FieldName
_syntheticFieldAlias = String -> FieldName
stringToFieldName String
alias
, _syntheticFieldValueFromSqlValue :: SqlValue -> Either String a
_syntheticFieldValueFromSqlValue = SqlValue -> Either String a
fromSqlValue
}
nullableSyntheticField :: SyntheticField a -> SyntheticField (Maybe a)
nullableSyntheticField :: forall a. SyntheticField a -> SyntheticField (Maybe a)
nullableSyntheticField SyntheticField a
synthField =
SyntheticField a
synthField
{ _syntheticFieldValueFromSqlValue :: SqlValue -> Either String (Maybe a)
_syntheticFieldValueFromSqlValue = \SqlValue
sqlValue ->
if SqlValue -> Bool
SqlValue.isSqlNull SqlValue
sqlValue
then Maybe a -> Either String (Maybe a)
forall a b. b -> Either a b
Right Maybe a
forall a. Maybe a
Nothing
else a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Either String a -> Either String (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SyntheticField a -> SqlValue -> Either String a
forall a. SyntheticField a -> SqlValue -> Either String a
syntheticFieldValueFromSqlValue SyntheticField a
synthField SqlValue
sqlValue
}
prefixSyntheticField ::
String ->
SyntheticField a ->
SyntheticField a
prefixSyntheticField :: forall a. String -> SyntheticField a -> SyntheticField a
prefixSyntheticField String
prefix SyntheticField a
synthField =
SyntheticField a
synthField
{ _syntheticFieldAlias :: FieldName
_syntheticFieldAlias = ByteString -> FieldName
byteStringToFieldName (String -> ByteString
B8.pack String
prefix ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
"_" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> FieldName -> ByteString
fieldNameToByteString (SyntheticField a -> FieldName
forall a. SyntheticField a -> FieldName
syntheticFieldAlias SyntheticField a
synthField))
}