module Snap.Snaplet.Redson.Snapless.Metamodel.Loader
(
loadGroups
, loadModel
, loadModels
)
where
import Control.Monad
import Data.Aeson as A
import Data.Functor
import qualified Data.ByteString.UTF8 as BU (fromString)
import qualified Data.ByteString.Lazy as LB (readFile)
import qualified Data.Map as M
import System.EasyFile
import Snap.Snaplet.Redson.Snapless.Metamodel
parseFile :: FromJSON a => FilePath -> IO (Maybe a)
parseFile filename = A.decode <$> LB.readFile filename
loadGroups :: FilePath -> IO (Maybe Groups)
loadGroups = parseFile
loadModel :: FilePath
-> Groups
-> IO (Maybe Model)
loadModel modelFile groups =
do
mres <- parseFile modelFile
return $ case mres of
Just model -> Just $
cacheIndices $
doApplications $
spliceGroups groups model
Nothing -> Nothing
pathToModelName :: FilePath -> ModelName
pathToModelName filepath = BU.fromString $ takeBaseName filepath
loadModels :: FilePath
-> FilePath
-> IO (M.Map ModelName Model)
loadModels directory groupsFile =
do
dirEntries <- getDirectoryContents directory
mdlFiles <- filterM doesFileExist
(map (\f -> directory ++ "/" ++ f) dirEntries)
gs <- loadGroups groupsFile
case gs of
Just groups -> do
mdls <- mapM (\m -> do
mres <- loadModel m groups
return $ case mres of
Just mdl -> mdl
Nothing -> error $ "Could not parse " ++ m
) mdlFiles
return $ M.fromList $
zip (map pathToModelName mdlFiles) mdls
Nothing -> error $ "Bad groups file " ++ groupsFile