{-# LANGUAGE NamedFieldPuns #-}
module Main
( main
) where
import qualified Data.ByteString.Lazy as L (readFile, writeFile)
import Data.Semigroup ((<>))
import Data.Version (showVersion)
import Options.Applicative (Parser, command, customExecParser, fullDesc, help, helper, info, long, metavar,
prefs, progDesc, short, showHelpOnError, strArgument, subparser, switch)
import qualified Options.Applicative as OA
import Paths_morpheus_graphql (version)
import System.FilePath.Posix (takeBaseName)
-- MORPHEUS
import Data.Morpheus.Document (toMorpheusHaskellAPi)
morpheusVersion :: String
morpheusVersion = showVersion version
main :: IO ()
main = defaultParser >>= buildHaskellApi
where
buildHaskellApi Options {optionCommand} = executeCommand optionCommand
where
executeCommand About = putStrLn $ "Morpheus GraphQL CLI, version " <> morpheusVersion
executeCommand Build {source, target} =
toMorpheusHaskellAPi (takeBaseName target) <$> L.readFile source >>= saveDocument
where
saveDocument (Left errors) = print errors
saveDocument (Right doc) = L.writeFile target doc
data Command
= Build { source :: FilePath
, target :: FilePath }
| About
deriving (Show)
data Options = Options
{ optionVerbose :: Bool
, optionCommand :: Command
} deriving (Show)
data Behavior = Behavior
{ bName :: String
, bValue :: Parser Command
, bDesc :: String
}
defaultParser :: IO Options
defaultParser = customExecParser (prefs showHelpOnError) (info (helper <*> optionParser) morpheusDescription)
where
morpheusDescription = fullDesc <> progDesc "Morpheus GraphQL CLI - haskell Api Generator"
-----------------------------------------------------
optionParser :: OA.Parser Options
optionParser = Options <$> versionParser <*> commandParser
where
versionParser = switch (long "version" <> short 'v' <> help "show Version number")
----------------------------------------------------------------------------------------------
commandParser = subparser $ foldr ((<>) . produceCommand) mempty commands
where
pathParser label = strArgument $ metavar label <> help (label <> " file")
produceCommand Behavior {bName, bValue, bDesc} =
command bName (info (helper <*> bValue) (fullDesc <> progDesc bDesc))
commands =
[ Behavior
{ bName = "build"
, bValue = pure Build <*> pathParser "Source.gql" <*> pathParser "Target.hs"
, bDesc = "builds haskell API from from GhraphQL schema \"*.gql\" "
}
, Behavior {bName = "about", bValue = pure About, bDesc = "api information"}
]