content: {-# LANGUAGE CPP               #-}
  {-# LANGUAGE OverloadedStrings #-}
  -- | Code generation and test running in different languages. (Switchbox.)
  module Data.Aeson.AutoType.CodeGen(
      Lang(..)
    , writeModule
    , runModule
    , defaultOutputFilename
    ) where
  
  import           Data.Text(Text)
  import qualified Data.HashMap.Strict as Map
  import           Data.Aeson.AutoType.Type
  import           System.Exit
  
  import           Data.Aeson.AutoType.CodeGen.Haskell
  import           Data.Aeson.AutoType.CodeGen.Elm
  
  -- | Available output languages.
  data Lang = Haskell
            | HaskellStrict
            | Elm
  
  -- | Default output filname is used, when there is no explicit output file path, or it is "-" (stdout).
  -- Default module name is consistent with it.
  defaultOutputFilename :: Lang -> FilePath
  defaultOutputFilename Haskell       = defaultHaskellFilename
  defaultOutputFilename HaskellStrict = defaultHaskellFilename
  defaultOutputFilename Elm           = defaultElmFilename
  
  -- | Write a Haskell module to an output file, or stdout if `-` filename is given.
  writeModule :: Lang -> FilePath -> Text -> Map.HashMap Text Type -> IO ()
  writeModule Haskell       = writeHaskellModule
  writeModule HaskellStrict = writeHaskellModule
  writeModule Elm           = writeElmModule
  
  -- | Run module in a given language.
  runModule :: Lang -> FilePath -> [String] -> IO ExitCode
  runModule Haskell       = runHaskellModule
  runModule HaskellStrict = runHaskellModuleStrict
  runModule Elm           = runElmModule
  