module Graphics.LambdaCube.Loader.ResourceScript (loadResourcesCfg,PathType(..),ResourcePath,ResourceGroup) where
import UU.Parsing
import UU.Scanner
import Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner
import Graphics.LambdaCube.Loader.ParserUtil
data PathType = PathDir
| PathZip
type ResourcePath = (PathType, String)
type ResourceGroup = (String, [ResourcePath])
loadResourcesCfg :: FilePath -> IO (Maybe [(String, [(PathType, String)])])
loadResourcesCfg file = do
txt <- readFile file
parseResourcesCfg file txt
parseResourcesCfg :: String -> String -> IO (Maybe [(String, [(PathType, String)])])
parseResourcesCfg file txt = case parseTokens pResourceScript (tokenize file txt) of
Left errs -> do
mapM_ (\m -> putStrLn $ "ResourceScript " ++ m) 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 :: AnaParser [Token] Pair Token (Maybe Token) [(String,[(PathType, String)])]
pResourceScript = pList pResourceGroup
pResourceGroup :: AnaParser [Token] Pair Token (Maybe Token) (String, [(PathType, String)])
pResourceGroup = (,) <$= "[" <*> pVarid <*= "]" <*> pList pResourceGroupContent
pResourceGroupContent :: AnaParser [Token] Pair Token (Maybe Token) (PathType, String)
pResourceGroupContent = pFileSystem <|> pZip
pFileSystem :: AnaParser [Token] Pair Token (Maybe Token) (PathType, String)
pFileSystem = (,) PathDir <$= "FileSystem" <*= "=" <*> pVarid
pZip :: AnaParser [Token] Pair Token (Maybe Token) (PathType, String)
pZip = (,) PathZip <$= "Zip" <*= "=" <*> pVarid