packages feed

fortran-src-extras-0.1.0: src/Language/Fortran/Extras/ModFiles.hs

-- | This module provides functions for handling FORTRAN source modules.
module Language.Fortran.Extras.ModFiles
  ( isModFile
  , decodeModFiles
  )
where

import           Control.Monad                  ( foldM
                                                , forM
                                                )
import           Data.Binary                    ( decodeFileOrFail )
import           Language.Fortran.Util.ModFile  ( emptyModFile
                                                , emptyModFiles
                                                , ModFiles
                                                , modFileSuffix
                                                )
import           Language.Fortran.Util.Files    ( rGetDirContents )
import           System.FilePath                ( takeExtension
                                                , (</>)
                                                )

-- | Return TRUE iff the file extension indicates a module file.
isModFile :: String -> Bool
isModFile = (== modFileSuffix) . takeExtension

-- | Read suspected module files from a list of files and obtain the
-- 'Language.Fortran.Util.ModFiles' object populated by their contents.
--
-- TODO: almost equal to Language.Fortran.Analysis.ModGraph.decodeModFiles
decodeModFiles :: [FilePath] -> IO ModFiles
decodeModFiles = foldM
  (\modFiles d -> do
    modFileNames  <- filter isModFile `fmap` rGetDirContents d
    addedModFiles <- forM modFileNames $ \modFileName -> do
      eResult <- decodeFileOrFail (d </> modFileName)
      case eResult of
        Left (offset, msg) -> do
          putStrLn
            $  modFileName
            ++ ": Error at offset "
            ++ show offset
            ++ ": "
            ++ msg
          return emptyModFile
        Right modFile -> do
          putStrLn $ modFileName ++ ": successfully parsed precompiled file."
          return modFile
    return $ addedModFiles ++ modFiles
  )
  emptyModFiles