{-# OPTIONS_GHC -W #-} {-# LANGUAGE FlexibleContexts #-} module Build.Artifact (read) where import Prelude hiding (read) import Control.Monad.Error (MonadError, throwError, MonadIO, liftIO) import qualified Data.ByteString.Lazy as LBS import qualified Data.Binary as Binary import System.Directory (doesFileExist) read :: (MonadIO m, MonadError String m, Binary.Binary a) => FilePath -> m a read filePath = do exists <- liftIO (doesFileExist filePath) if exists then decode else throwError notFound where decode = do bytes <- liftIO (LBS.readFile filePath) case Binary.decodeOrFail bytes of Right (_, _, binaryInfo) -> return binaryInfo Left (_, _, _) -> throwError corrupted corrupted = concat [ "Error reading build artifact ", filePath, "\n" , " The file was generated by a previous build and may be outdated or corrupt.\n" , " Please remove the file and try again." ] notFound = "Unable to find file " ++ filePath ++ " for deserialization!"