packages feed

descript-lang-0.2.0.0: src/Descript/Build/Read/File.hs

module Descript.Build.Read.File
  ( mkFile
  , loadFile
  , defaultResolver
  ) where

import Descript.Build.Read.Read
import qualified Descript.BasicInj as BasicInj
import Descript.Misc
import Data.Text (Text)
import qualified Data.Text.IO as Text
import Core.Control.Monad.Trans
import System.FilePath

-- | Creates a file with the given path and contents, which uses the
-- default resolver.
mkFile :: FilePath -> Text -> DFile IO
mkFile = mkDepFile []

-- | Creates a file with the given path and contents, which uses the
-- default resolver, provided that this is a dependency of the given
-- modules.
mkDepFile :: [RelScope] -> FilePath -> Text -> DFile IO
mkDepFile dpds path contents
  = DFile
  { depResolver = defaultDepResolver dpds $ takeDirectory path
  , sfile = mkSFile path contents
  }

-- | Reads the file with the given path.
loadFile :: FilePath -> IO (DFile IO)
loadFile path = mkFile path <$> Text.readFile path

defaultResolver :: FilePath -> DepResolver IO
defaultResolver = defaultDepResolver []

-- | The default resolver for a dependency of the given modules.
defaultDepResolver :: [RelScope] -> FilePath -> DepResolver IO
defaultDepResolver dpds path
  = readDepResolver dpds path =<< defaultTextResolver path

readDepResolver :: [RelScope] -> FilePath -> Text -> DepResolver IO
readDepResolver dpds basePath contents
  = DepResolver
  { showDepResolver = "readDepResolver " ++ show basePath ++ show contents
  , resolveDep = resolve
  }
  where resolve relScope = do
          guardCycleT relScope dpds
          readDep (relScope : dpds) (scopeFilepath basePath relScope) contents

readDep :: [RelScope] -> FilePath -> Text -> DepResultT IO
readDep dpds path contents
  = fmap BasicInj.dsourceAModule . validateR =<< readSrcR file
  where readSrcR = gresToDres (summaryF $ sfile file) . readSrc
        validateR ddsrc = do
          guardPromoteCycleT $ dirtyWarnings $ depdDep ddsrc
          gresToDres validateErrorSummary $ hoist $ BasicInj.validate ddsrc
        gresToDres summary' = mapErrorT $ DepNotBuild . summary'
        file = mkDepFile dpds path contents