module Database.Migrate.Migration.FileInferred (
migration
, up
, down
, directory
) where
import Data.List (isSuffixOf, intercalate, groupBy)
import Data.Text (Text, pack)
import Database.Migrate.Migration
import qualified Database.Migrate.Migration.File as File
import qualified Database.Migrate.Migration.FileStandard as FileStandard
import System.FilePath
import System.Directory
directory :: FilePath -> IO (Either Text [Migration])
directory path = do
changes <- (filter (\p -> isSuffixOf ".up.sql" p || isSuffixOf ".down.sql" p)) `fmap` getDirectoryContents path
return $ mapM (\group ->
case group of
a : _ : [] -> (Right $ migration (dropExtension . dropExtension $ a))
a : [] -> (Right $ (if ((takeExtension . takeExtension $ a) == "up") then File.up else File.down) (infer a) a)
_ -> (Left . pack $ "Duplicate prefix detected in: " ++ (intercalate "," group))
) $ groupBy (\a b -> (dropExtension . dropExtension $ a) == (dropExtension . dropExtension $ b)) changes
migration :: FilePath -> Migration
migration prefix =
FileStandard.migration (infer prefix) prefix
up :: FilePath -> Migration
up prefix =
FileStandard.up (infer prefix) prefix
down :: FilePath -> Migration
down prefix =
FileStandard.down (infer prefix) prefix
infer :: FilePath -> MigrationId
infer =
pack . dropExtensions . last . splitPath