packages feed

aeson-schema-0.1.0.0: generate-aeson-schema.hs

{-# LANGUAGE DeriveDataTypeable #-}

module Main where

import Prelude hiding (readFile)
import Data.Version (showVersion)
import System.Console.CmdArgs
import Data.Aeson.Parser (json)
import Data.ByteString (readFile)
import Data.Attoparsec.ByteString (parse, Result, IResult (..))
import Data.Aeson.Schema.CodeGen (generateModule)
import Language.Haskell.TH.Syntax (runQ)
import Data.Aeson (fromJSON)
import qualified Data.Aeson as A
import Data.Text (Text, pack)
import qualified Data.Text.IO as TIO
import qualified Data.Map as M

import Paths_aeson_schema (version)
import Data.Aeson.Schema (Schema (..))

data GenerateArgs = GenerateArgs
  { modName :: String
  , inputSchema :: FilePath
  } deriving (Data, Show, Typeable)

generateArgs :: GenerateArgs
generateArgs = GenerateArgs
  { modName = "Schema" &= name "module-name" &= opt "Schema" &= help "Name of the generated module"
  , inputSchema = "" &= typFile &= argPos 0
  } &= summary ("generate-aeson-schema-" ++ showVersion version)

main :: IO ()
main = do
  args <- cmdArgs generateArgs
  contents <- readFile $ inputSchema args
  value <- iResultM $ parse json contents
  case fromJSON value :: A.Result (Schema Text) of
    A.Error str -> fail str
    A.Success schema -> do
      let m = M.fromList [(pack "A", schema)]
      (code, _) <- runQ $ generateModule (pack $ modName args) m
      TIO.putStrLn code
  where
    iResultM :: (Monad m) => Result a -> m a
    iResultM (Fail _ _ err) = fail err
    iResultM (Partial _) = fail "unexpected end of file"
    iResultM (Done _ r) = return r