module ServantSerf.Main where
import qualified Control.Monad as Monad
import qualified ServantSerf.Directory as Directory
import qualified ServantSerf.Module as Module
import qualified ServantSerf.Type.Config as Config
import qualified ServantSerf.Type.Context as Context
import qualified ServantSerf.Type.Flag as Flag
import qualified ServantSerf.Version as Version
import qualified System.Console.GetOpt as Console
import qualified System.Environment as Environment
import qualified System.Exit as Exit
import qualified System.FilePath as FilePath
defaultMain :: IO ()
defaultMain :: IO ()
defaultMain = do
String
name <- IO String
Environment.getProgName
[String]
arguments <- IO [String]
Environment.getArgs
String -> [String] -> IO ()
mainWith String
name [String]
arguments
mainWith :: String -> [String] -> IO ()
mainWith :: String -> [String] -> IO ()
mainWith String
name [String]
arguments = do
Context
context <- forall (m :: * -> *). MonadThrow m => [String] -> m Context
Context.fromArguments [String]
arguments
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (Config -> Bool
Config.help forall a b. (a -> b) -> a -> b
$ Context -> Config
Context.config Context
context) forall a b. (a -> b) -> a -> b
$ do
String -> IO ()
putStr forall a b. (a -> b) -> a -> b
$ forall a. String -> [OptDescr a] -> String
Console.usageInfo (String -> String
header String
name) [OptDescr Flag]
Flag.options
forall a. IO a
Exit.exitSuccess
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (Config -> Bool
Config.version forall a b. (a -> b) -> a -> b
$ Context -> Config
Context.config Context
context) forall a b. (a -> b) -> a -> b
$ do
String -> IO ()
putStrLn String
Version.string
forall a. IO a
Exit.exitSuccess
[String]
files <-
Depth -> String -> IO [String]
Directory.list (Config -> Depth
Config.depth forall a b. (a -> b) -> a -> b
$ Context -> Config
Context.config Context
context)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
FilePath.dropExtension
forall a b. (a -> b) -> a -> b
$ Context -> String
Context.source Context
context
String -> String -> IO ()
writeFile (Context -> String
Context.output Context
context) forall a b. (a -> b) -> a -> b
$ Context -> [String] -> String
Module.generate Context
context [String]
files
header :: String -> String
String
name = String
name forall a. Semigroup a => a -> a -> a
<> String
" SOURCE INPUT OUTPUT"