{-# LANGUAGE LambdaCase #-} {-# LANGUAGE ScopedTypeVariables #-} -- | Module for writing an already linted map Repository back out again. module WriteRepo where import CheckDir (DirResult (dirresultMaps), resultIsFatal) import CheckMap (MapResult (mapresultAdjusted, mapresultDepends)) import Control.Monad (forM_) import Data.Aeson (encodeFile) import Data.Map.Strict (toList) import Data.Maybe (mapMaybe) import Data.Set (Set) import qualified Data.Set as S import Paths (normalise) import System.Directory.Extra (copyFile, createDirectoryIfMissing) import System.FilePath (takeDirectory) import qualified System.FilePath as FP import System.FilePath.Posix (()) import Types (Dep (Local)) writeAdjustedRepository :: FilePath -> FilePath -> DirResult -> IO () writeAdjustedRepository inPath outPath result | resultIsFatal result = pure () | otherwise = do createDirectoryIfMissing True outPath -- write out all maps mapM_ (\(path,out) -> encodeFile (outPath path) $ mapresultAdjusted out) (toList $ dirresultMaps result) -- 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 putStrLn $ "copying " <> assetPath <> " → " <> newPath copyFile assetPath newPath