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 -- | The type of path leading to a resource. data PathType = PathDir -- ^ An ordinary directory. | PathZip -- ^ A zip compressed directory. 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