{-# LANGUAGE LambdaCase #-} {-# LANGUAGE ScopedTypeVariables #-} -- | Module for writing an already linted map Repository back out again. module WriteRepo where import CheckDir (DirResult (..), resultIsFatal) import CheckMap (MapResult (..)) import Control.Monad (forM_, unless) import Control.Monad.Extra (ifM) import Data.Aeson (encodeFile) import Data.Map.Strict (toList) import Data.Maybe (mapMaybe) import Data.Set (Set) import qualified Data.Set as S import LintConfig (LintConfig (configDontCopyAssets), LintConfig') import Paths (normalise) import System.Directory.Extra (copyFile, createDirectoryIfMissing, doesDirectoryExist) import System.Exit (ExitCode (..)) import System.FilePath (takeDirectory) import qualified System.FilePath as FP import System.FilePath.Posix (()) import Types (Dep (Local)) writeAdjustedRepository :: LintConfig' -> FilePath -> FilePath -> DirResult -> IO ExitCode writeAdjustedRepository config inPath outPath result | resultIsFatal config result = pure (ExitFailure 1) | otherwise = do ifM (doesDirectoryExist outPath) (pure (ExitFailure 2)) $ do createDirectoryIfMissing True outPath -- write out all maps mapM_ (\(path,out) -> encodeFile (outPath path) $ mapresultAdjusted out) (toList $ dirresultMaps result) unless (configDontCopyAssets config) $ do -- collect asset dependencies of maps -- TODO: its kinda weird doing that here, tbh let localdeps :: Set FilePath = S.fromList . concatMap (\(mappath,mapresult) -> let mapdir = takeDirectory mappath in mapMaybe (\case Local path -> Just . normalise mapdir $ path _ -> Nothing) $ mapresultDepends mapresult) . toList $ dirresultMaps result -- copy all assets forM_ localdeps $ \path -> let assetPath = FP.normalise $ inPath path newPath = FP.normalise $ outPath path in do createDirectoryIfMissing True (takeDirectory newPath) copyFile assetPath newPath pure ExitSuccess