module Parser where

import           Control.Exception (try)
import           Language.Types
import           Parser.Internal
import           Types


parseFile :: FilePath -> Sparker SparkFile
parseFile file = do
    esf <- liftIO $ try $ parseFileIO file
    case esf of
        Left ioe -> throwError $ UnpredictedError $ show (ioe :: IOError)
        Right sf -> do
            case sf of
                Left pe -> throwError $ ParseError pe
                Right cs -> return cs

parseFileIO :: FilePath -> IO (Either ParseError SparkFile)
parseFileIO file = (liftIO $ readFile file) >>= return . parseCardFile file