module Language.Drasil.Code.PackageFiles (
consolidatePackageFiles,
createPackageFiles,
) where
import Text.PrettyPrint.HughesPJ ( Doc, Doc, render )
import Drasil.GOOL (FileData(..), ModData(modDoc))
import Utils.Drasil (createDirIfMissing)
import Language.Drasil.Code.FileData (FileAndContents(fileDoc))
import qualified Language.Drasil.Code.FileData as D (
filePath)
import System.FilePath.Posix (takeDirectory)
import System.IO (hPutStrLn, hClose, openFile, IOMode(WriteMode))
newtype PackageFiles = PackageFiles [(FilePath, Doc)]
consolidatePackageFiles :: [FileData] -> [FileAndContents] -> PackageFiles
consolidatePackageFiles :: [FileData] -> [FileAndContents] -> PackageFiles
consolidatePackageFiles [FileData]
files [FileAndContents]
aux = [(FilePath, Doc)] -> PackageFiles
PackageFiles ([(FilePath, Doc)] -> PackageFiles)
-> [(FilePath, Doc)] -> PackageFiles
forall a b. (a -> b) -> a -> b
$ [FilePath] -> [Doc] -> [(FilePath, Doc)]
forall a b. [a] -> [b] -> [(a, b)]
zip ((FileData -> FilePath) -> [FileData] -> [FilePath]
forall a b. (a -> b) -> [a] -> [b]
map FileData -> FilePath
filePath [FileData]
files [FilePath] -> [FilePath] -> [FilePath]
forall a. [a] -> [a] -> [a]
++ (FileAndContents -> FilePath) -> [FileAndContents] -> [FilePath]
forall a b. (a -> b) -> [a] -> [b]
map FileAndContents -> FilePath
D.filePath [FileAndContents]
aux)
((FileData -> Doc) -> [FileData] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (ModData -> Doc
modDoc (ModData -> Doc) -> (FileData -> ModData) -> FileData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FileData -> ModData
fileMod) [FileData]
files [Doc] -> [Doc] -> [Doc]
forall a. [a] -> [a] -> [a]
++ (FileAndContents -> Doc) -> [FileAndContents] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map FileAndContents -> Doc
fileDoc [FileAndContents]
aux)
createPackageFiles :: PackageFiles -> IO ()
createPackageFiles :: PackageFiles -> IO ()
createPackageFiles (PackageFiles [(FilePath, Doc)]
cs) = ((FilePath, Doc) -> IO ()) -> [(FilePath, Doc)] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (FilePath, Doc) -> IO ()
createPackageFile [(FilePath, Doc)]
cs
createPackageFile :: (FilePath, Doc) -> IO ()
createPackageFile :: (FilePath, Doc) -> IO ()
createPackageFile (FilePath
path, Doc
contents) = do
Bool -> FilePath -> IO ()
createDirIfMissing Bool
True (FilePath -> FilePath
takeDirectory FilePath
path)
Handle
h <- FilePath -> IOMode -> IO Handle
openFile FilePath
path IOMode
WriteMode
Handle -> FilePath -> IO ()
hPutStrLn Handle
h (Doc -> FilePath
render Doc
contents)
Handle -> IO ()
hClose Handle
h