module Database.HaskellDB.DriverAPI (
DriverInterface(..),
MonadIO,
defaultdriver,
getOptions,
getGenerator
) where
import Database.HaskellDB.Database (Database)
import Database.HaskellDB.Sql.Generate (SqlGenerator)
import Database.HaskellDB.Sql.Default (defaultSqlGenerator)
import Database.HaskellDB.Sql.MySQL as MySQL
import Database.HaskellDB.Sql.PostgreSQL as PostgreSQL
import Database.HaskellDB.Sql.SQLite as SQLite
import Control.Monad (liftM)
import Control.Monad.Trans (MonadIO)
data DriverInterface = DriverInterface
{ connect :: forall m a. MonadIO m => [(String,String)] -> (Database -> m a) -> m a }
defaultdriver :: DriverInterface
defaultdriver = DriverInterface {connect = undefined}
getOptions ::Monad m => [String]
-> [(String,String)]
-> m [String]
getOptions [] _ = return []
getOptions (x:xs) ys =
case lookup x ys of
Nothing -> fail $ "Missing field " ++ x
Just v -> liftM (v:) $ getOptions xs ys
getGenerator :: Monad m =>
[(String,String)]
-> m SqlGenerator
getGenerator opts = maybe (return defaultSqlGenerator) f $ lookup "generator" opts
where f n = maybe (fail msg) return $ lookup n generators
where msg = "Unknown SqlGenerator: " ++ n
generators :: [(String,SqlGenerator)]
generators = [("mysql", MySQL.generator),
("postgresql", PostgreSQL.generator),
("sqlite", SQLite.generator),
("default", defaultSqlGenerator)]