{-# OPTIONS_GHC -W #-}
module Build.Interface (load,isValid) where

import qualified Data.ByteString.Lazy as L
import qualified Data.Binary as Binary

import qualified Build.Print as Print
import qualified Elm.Internal.Version as Version
import System.Directory (doesFileExist)
import AST.Module as Module

load :: Binary.Binary a => FilePath -> IO a
load filePath =
  do exists <- doesFileExist filePath
     case exists of
       False -> Print.failure $ "Unable to find file " ++ filePath ++ " for deserialization!"
       True -> do
         bytes <- L.readFile filePath
         case Binary.decodeOrFail bytes of
           Right (_, _, binaryInfo) -> return binaryInfo
           Left (_, offset, err) -> Print.failure $ msg offset err

  where
    msg offset err = concat
        [ "Error reading build artifact: ", filePath, "\n"
        , "    '", err, "' at offset ", show offset, "\n"
        , "    The file was generated by a previous build and may be outdated or corrupt.\n"
        , "    Please remove the file and try again."
        ]

isValid :: FilePath -> (String, Module.Interface) -> Either String (String, Module.Interface)
isValid filePath (name, interface) =
    let version = iVersion interface in
    if version == Version.elmVersion
    then Right (name, interface)
    else Left $ concat
             [ "Error reading build artifact: ", filePath, "\n"
             , "    It was generated by version ", show version, " of the compiler,\n"
             , "    but you are using version ", show Version.elmVersion, "\n"
             , "    Please remove the file and try again.\n"
             ]