module Database.Rivet.Main where
import Control.Monad
import Data.Monoid
import Data.Text (Text)
import qualified Data.Text.IO as T
import Database.Rivet
data Mode = MigrateUp | MigrateDown | MigrateStatus
main :: Monad m =>
Adaptor m ->
Mode ->
[(Text, Migration m ())] ->
IO ()
main adaptor mode migrations = do
let notRun m = fmap not $ checkMigration adaptor m
case mode of
MigrateUp ->
do toRun <- filterM (notRun . fst) migrations
mapM_ (\(name, m) -> do runMigration Up adaptor name m
T.putStrLn ("Ran " <> name))
toRun
MigrateDown ->
do toDown <- dropWhileM (notRun . fst)
(reverse migrations)
case toDown of
((name, m) :_) -> do runMigration Down adaptor name m
T.putStrLn ("Reverted " <> name)
[] -> putStrLn "No migrations remaining."
MigrateStatus ->
mapM_ (\(m,_) ->
do r <- checkMigration adaptor m
if r
then T.putStrLn $ " APPLIED " <> m
else T.putStrLn m)
migrations
where dropWhileM _ [] = return []
dropWhileM f (x:xs) = do x' <- f x
if x'
then dropWhileM f xs
else return (x:xs)