content: -- Copyright 2020 United States Government as represented by the Administrator
  -- of the National Aeronautics and Space Administration. All Rights Reserved.
  --
  -- Disclaimers
  --
  -- Licensed under the Apache License, Version 2.0 (the "License"); you may
  -- not use this file except in compliance with the License. You may obtain a
  -- copy of the License at
  --
  --      https://www.apache.org/licenses/LICENSE-2.0
  --
  -- Unless required by applicable law or agreed to in writing, software
  -- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  -- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  -- License for the specific language governing permissions and limitations
  -- under the License.
  --
  -- | Auxiliary functions for working with values of type 'ByteString'.
  module Data.ByteString.Extra where
  
  import           Control.Exception    ( catch )
  import qualified Data.ByteString.Lazy as B
  import           System.IO.Error      ( isDoesNotExistError )
  
  -- * Safe I/O
  
  -- | Safely read a file into a lazy 'ByteString', returning a 'Left' error
  -- message if the file cannot be opened.
  safeReadFile :: FilePath -> IO (Either String B.ByteString)
  safeReadFile fp =
    catch (return <$> B.readFile fp) $ \e ->
      if isDoesNotExistError e
        then return $ Left $ strByteStringFileNotFound fp
        else return $ Left $ strByteStringCannotOpenFile fp
  
  -- ** Error messages
  
  -- | File-not-found message.
  strByteStringFileNotFound :: FilePath -> String
  strByteStringFileNotFound fp = "File not found: " ++ fp
  
  -- | Cannot-open-file message.
  strByteStringCannotOpenFile :: FilePath -> String
  strByteStringCannotOpenFile fp = "Error opening file " ++ fp
  