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
header :: String -> String
header String
name = String
name forall a. Semigroup a => a -> a -> a
<> String
" SOURCE INPUT OUTPUT"