postgresql-query-3.2.0: src/Database/PostgreSQL/Query/TH.hs
module Database.PostgreSQL.Query.TH
( -- * Deriving instances
deriveEverything
, module Database.PostgreSQL.Query.TH.Entity
, module Database.PostgreSQL.Query.TH.Enum
, module Database.PostgreSQL.Query.TH.Row
, module Database.PostgreSQL.Query.TH.SqlExp
) where
import Database.PostgreSQL.Query.TH.Entity
import Database.PostgreSQL.Query.TH.Enum
import Database.PostgreSQL.Query.TH.Row
import Database.PostgreSQL.Query.TH.SqlExp
import Language.Haskell.TH
{- | Calls sequently `deriveFromRow` `deriveToRow` `deriveEntity`. E.g. code like this:
@
data Agent = Agent
{ aName :: !Text
, aAttributes :: !HStoreMap
, aLongWeirdName :: !Int
} deriving (Ord, Eq, Show)
$(deriveEverything
def { eoIdType = ''Id
, eoTableName = textFN . toUnderscore'
, eoColumnNames = textFN . toUnderscore' . drop 1
, eoDeriveClasses =
[''Show, ''Read, ''Ord, ''Eq
, ''FromField, ''ToField, ''PathPiece]
}
''Agent )
@
will generate that:
@
instance ToRow Agent where
toRow (Agent a_aE3w a_aE3x a_aE3y)
= [toField a_aE3w, toField a_aE3x, toField a_aE3y]
instance FromRow Agent where
fromRow
= Agent <$> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
instance Database.PostgreSQL.Query.Entity Agent where
newtype EntityId Agent
= AgentId {getAgentId :: Id}
deriving (Show, Read, Ord, Eq, FromField, ToField, PathPiece)
tableName _ = "agent"
fieldNames _ = ["name", "attributes", "long_weird_name"]
type AgentId = EntityId Agent
@
-}
deriveEverything :: EntityOptions -> Name -> Q [Dec]
deriveEverything opts tname = fmap concat $ sequence
[ deriveToRow tname
, deriveFromRow tname
, deriveEntity opts tname ]