packages feed

lambdacube-engine-0.1.1: Graphics/LambdaCube/Loader/ResourceScript.hs

module Graphics.LambdaCube.Loader.ResourceScript (loadResourcesCfg,PathType(..),ResourcePath,ResourceGroup) where

-- import the the library functions from uulib
import UU.Parsing
import UU.Scanner

-- import our custom made Alex-scanner
import Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner
import Graphics.LambdaCube.Loader.ParserUtil
import System.Log.Logger

data PathType = PathDir | PathZip
type ResourcePath = (PathType,String)
type ResourceGroup = (String,[ResourcePath])

loadResourcesCfg file = do
    txt <- readFile file
    parseResourcesCfg file txt

parseResourcesCfg file txt
    = let res = parseTokens pResourceScript (tokenize file txt)
    in case res of
        Left errs -> do
            mapM_ (errorM "ResourceScript") errs
            return Nothing
        Right tree -> return (Just tree)
		
type TokenParser a = Parser Token a

parseTokens :: TokenParser a -> [Token] -> Either [String] a
parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)
  where
    steps = parse p tks
    msgs  = getMsgs steps
    (Pair v final) = evalSteps steps

pResourceScript = pList pResourceGroup
pResourceGroup = (,) <$= "[" <*> pVarid <*= "]" <*> pList pResourceGroupContent
pResourceGroupContent = pFileSystem <|> pZip

pFileSystem = (,) PathDir <$= "FileSystem" <*= "=" <*> pVarid
pZip = (,) PathZip <$= "Zip" <*= "=" <*> pVarid