{-# LANGUAGE OverloadedStrings #-}

module Data.Makefile.Render.Internal where
import           Data.Makefile
import           Data.Monoid
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.IO as TL
import Data.Text.Lazy.Builder

writeMakefile :: FilePath -> Makefile -> IO ()
writeMakefile f m = do
  let s = encodeMakefile m
  TL.writeFile f s

encodeMakefile :: Makefile -> TL.Text
encodeMakefile = toLazyText . renderMakefile

renderMakefile :: Makefile -> Builder
renderMakefile (Makefile es ) = mconcat [renderEntry e <> singleton '\n' | e <- es]

renderEntry :: Entry -> Builder
renderEntry (Assignment RecursiveAssign key value ) =
  fromText key <> singleton '=' <> fromText value
renderEntry (Assignment SimpleAssign key value ) =
  fromText key <> fromText ":=" <> fromText value
renderEntry (Assignment SimplePosixAssign key value ) =
  fromText key <> fromText "::=" <> fromText value
renderEntry (Assignment ConditionalAssign key value ) =
  fromText key <> fromText "?=" <> fromText value
renderEntry (Assignment ShellAssign key value ) =
  fromText key <> fromText "!=" <> fromText value
renderEntry (Assignment AppendAssign key value ) =
  fromText key <> fromText "+=" <> fromText value
renderEntry (Rule (Target t) ds cmds) =
  fromText t <> singleton ':' <>
  mconcat [singleton ' ' <> renderDep d | d <- ds] <>
  singleton '\n' <>
  mconcat [renderCmd cmd <> singleton '\n' | cmd <- cmds]

renderDep :: Dependency -> Builder
renderDep (Dependency dep ) = fromText dep

renderCmd :: Command -> Builder
renderCmd (Command cmd ) = singleton '\t' <> fromText cmd