module Parse
( parse
, displayError
, printWarnings
, Result(..)
) where
import Data.Maybe
import Distribution.PackageDescription.Parse
import Distribution.ParseUtils
import Distribution.Simple.Utils
import Distribution.Verbosity
import System.Environment
import System.Exit
import System.IO
data Result a
= Error (Maybe LineNo)
String
| Warn [PWarning]
| Success a
deriving (Show)
instance Functor Result where
fmap f (Success a) = Success (f a)
fmap _ (Warn ps) = Warn ps
fmap _ (Error m s) = Error m s
parse input =
case parseGenericPackageDescription input of
ParseFailed e -> uncurry Error $ locatedErrorMsg e
ParseOk warnings x
| null warnings -> Success x
| otherwise -> Warn $ reverse warnings
displayError fpath line' message = do
prog <- getProgName
hPutStrLn stderr $
prog ++
": " ++
fromMaybe "" fpath ++
(case line' of
Just lineno -> ":" ++ show lineno
Nothing -> "") ++
": " ++ message
exitFailure
printWarnings ps = mapM_ (warn normal . showPWarning "") ps >> exitFailure