@@ -24,7 +24,9 @@ import Control.Applicative
2424import Control.Monad.State.Strict
2525import Data.List (union)
2626import Data.Maybe (fromJust, isNothing)
27−import System.FilePath (isValid, takeFileName)
27+import System.Directory (doesFileExist)
28+import System.Exit
29+import System.FilePath (isValid, takeExtension, takeFileName)
2830import qualified Text.PrettyPrint.ANSI.Leijen as PP
2931import Text.Trifecta hiding (char, charLiteral, natural, span, string, symbol,
3032 whiteSpace)
@@ -58,10 +60,19 @@ instance TokenParsing PParser where
5860
5961parseDesc :: FilePath -> IO PkgDesc
6062parseDesc fp = do
61− p <- readFile fp
62− case runparser pPkg defaultPkg fp p of
63− Failure (ErrInfo err _) -> fail (show $ PP.plain err)
64− Success x -> return x
63+ when (not $ takeExtension fp == ".ipkg") $ do
64+ putStrLn $ unwords ["The presented iPKG file does not have a '.ipkg' extension:", show fp]
65+ exitWith (ExitFailure 1)
66+ res <- doesFileExist fp
67+ if res
68+ then do
69+ p <- readFile fp
70+ case runparser pPkg defaultPkg fp p of
71+ Failure (ErrInfo err _) -> fail (show $ PP.plain err)
72+ Success x -> return x
73+ else do
74+ putStrLn $ unwords [ "The presented iPKG file does not exist:", show fp]
75+ exitWith (ExitFailure 1)
6576
6677pPkg :: PParser PkgDesc
6778pPkg = do