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