json-autotype-2.0.0: Data/Aeson/AutoType/CodeGen/Elm.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Wrappers for generating prologue and epilogue code in Haskell.
module Data.Aeson.AutoType.CodeGen.Elm(
defaultElmFilename
, writeElmModule
, runElmModule
) where
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import Data.Text
import qualified Data.HashMap.Strict as Map
import Control.Arrow (first)
import Control.Exception (assert)
import Data.Monoid ((<>))
import System.FilePath
import System.IO
import System.Process (system)
import System.Exit (ExitCode)
import Data.Aeson.AutoType.Format
import Data.Aeson.AutoType.Type
import Data.Aeson.AutoType.Util
import Data.Aeson.AutoType.CodeGen.ElmFormat
import Debug.Trace(trace)
defaultElmFilename = "JSONTypes.elm"
header :: Text -> Text
header moduleName = Text.unlines [
Text.unwords ["module ", capitalize moduleName, " exposing(..)"]
,""
,"-- elm-package install toastal/either"
,"-- elm-package install NoRedInk/elm-decode-pipeline"
,"import Either exposing (Either, unpack)"
,"import Json.Encode exposing (..)"
,"import Json.Decode exposing (..)"
,"import Json.Decode.Pipeline exposing (..)"
,""]
epilogue :: Text -> Text
epilogue toplevelName = Text.unlines []
-- | Write a Haskell module to an output file, or stdout if `-` filename is given.
writeElmModule :: FilePath -> Text -> Map.HashMap Text Type -> IO ()
writeElmModule outputFilename toplevelName types =
withFileOrHandle outputFilename WriteMode stdout $ \hOut ->
assert (trace extension extension == ".elm") $ do
Text.hPutStrLn hOut $ header $ Text.pack moduleName
-- We write types as Haskell type declarations to output handle
Text.hPutStrLn hOut $ displaySplitTypes types
Text.hPutStrLn hOut $ epilogue toplevelName
where
(moduleName, extension) =
first normalizeTypeName' $
splitExtension $
if outputFilename == "-"
then defaultElmFilename
else outputFilename
normalizeTypeName' = Text.unpack . normalizeTypeName . Text.pack
runElmModule :: [String] -> IO ExitCode
runElmModule arguments = do
hPutStrLn stderr "Compiling *not* running Elm module for a test."
system $ Prelude.unwords $ ["elm", "make", Prelude.head arguments] -- ignore parsing args