{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}

-- |
-- Module      : Database.HDBC.Record.TH
-- Copyright   : 2013 Kei Hibino
-- License     : BSD3
--
-- Maintainer  : ex8k.hibino@gmail.com
-- Stability   : experimental
-- Portability : unknown
--
-- This module provides DB-record templates depends on HDBC.
module Database.HDBC.Record.TH (
  derivePersistableInstanceFromConvertible,
  ) where

import Data.Convertible (convert)
import Language.Haskell.TH (Q, Dec, Type)
import Database.HDBC (SqlValue)
import Database.HDBC.SqlValueExtra ()
import Database.Record (FromSql (..), ToSql(..))
import Database.Record.FromSql (valueRecordFromSql)
import Database.Record.ToSql (valueRecordToSql)


-- | Template to declare HDBC instances of DB-record against single value type.
derivePersistableInstanceFromConvertible :: Q Type  -- ^ Type to implement instances
                                         -> Q [Dec] -- ^ Result declarations
derivePersistableInstanceFromConvertible typ =
  [d| instance FromSql SqlValue $(typ)  where
        recordFromSql = valueRecordFromSql convert

      instance ToSql SqlValue $(typ)  where
        recordToSql = valueRecordToSql convert
    |]