packages feed

mallard-0.5.0.0: lib/Database/Mallard/File.hs

{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Database.Mallard.File
    ( importMigrationDirectory
    , importMigrationFile
    ) where

import           Control.Exception
import           Control.Lens
import           Control.Monad.Catch
import           Control.Monad.Reader
import qualified Data.ByteString         as BS
import qualified Data.HashMap.Strict     as Map
import           Database.Mallard.Parser
import           Database.Mallard.Types
import           Path
import           Path.IO
import           Text.Megaparsec

scanDirectoryForFiles :: (MonadIO m, MonadThrow m) => Path Abs Dir -> m [Path Abs File]
scanDirectoryForFiles dir = concat <$> walkDirAccum Nothing (\_ _ c -> return [c]) dir

importMigrationDirectory :: (MonadIO m, MonadThrow m) => Path Abs Dir -> m MigrationTable
importMigrationDirectory root = do
    files <- scanDirectoryForFiles root
    migrations <- mapM importMigrationFile' files
    return $ Map.fromList (fmap (\m -> (m ^. migrationName, m)) (concat migrations))

importMigrationFile :: (MonadIO m, MonadThrow m) => Path Abs File -> m MigrationTable
importMigrationFile file = Map.fromList . fmap (\m -> (m ^. migrationName, m)) <$> importMigrationFile' file

importMigrationFile' :: (MonadIO m, MonadThrow m) => Path Abs File -> m [Migration]
importMigrationFile' file = do
    fileContent <- liftIO $ BS.readFile (toFilePath file)
    let parseResult = runParser parseMigrations (toFilePath file) fileContent
    case parseResult of
        Left er -> throw $ ParserException file er
        Right m -> return m