mustache-0.2.0.0: src/bin/Main.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE UnicodeSyntax #-}
module Main (main) where
import Data.Aeson (Value, eitherDecode)
import qualified Data.ByteString as B (readFile)
import qualified Data.ByteString.Lazy as BS (readFile)
import Data.Foldable (for_)
import qualified Data.Text.IO as TIO (putStrLn)
import Data.Yaml (decodeEither)
import Prelude.Unicode
import System.Console.CmdArgs.Implicit (Data, Typeable, argPos, args,
cmdArgs, def, help, summary,
typ, (&=))
import System.FilePath (takeExtension)
import Text.Mustache (automaticCompile, substitute,
toMustache)
data Arguments = Arguments
{ template ∷ FilePath
, templateDirs ∷ [FilePath]
, dataFiles ∷ [FilePath]
} deriving (Show, Data, Typeable)
commandArgs ∷ Arguments
commandArgs = Arguments
{ template = def
&= argPos 0
&= typ "TEMPLATE"
, dataFiles = def
&= args
&= typ "DATA-FILES"
, templateDirs = ["."]
&= help "The directories in which to search for the templates"
&= typ "DIRECTORIES"
} &= summary "Simple mustache template subtitution"
readJSON ∷ FilePath → IO (Either String Value)
readJSON = fmap eitherDecode ∘ BS.readFile
readYAML ∷ FilePath → IO (Either String Value)
readYAML = fmap decodeEither ∘ B.readFile
main ∷ IO ()
main = do
(Arguments { template, templateDirs, dataFiles }) ← cmdArgs commandArgs
eitherTemplate ← automaticCompile templateDirs template
case eitherTemplate of
Left err → print err
Right compiledTemplate →
for_ dataFiles $ \file → do
let decoder =
case takeExtension file of
".yml" → readYAML
".yaml" → readYAML
_ → readJSON
decoded ← decoder file
either
putStrLn
(TIO.putStrLn ∘ substitute compiledTemplate ∘ toMustache)
decoded