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 <- [String] -> IO Context
forall (m :: * -> *). MonadThrow m => [String] -> m Context
Context.fromArguments [String]
arguments
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (Config -> Bool
Config.help (Config -> Bool) -> Config -> Bool
forall a b. (a -> b) -> a -> b
$ Context -> Config
Context.config Context
context) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
    String -> IO ()
putStr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> [OptDescr Flag] -> String
forall a. String -> [OptDescr a] -> String
Console.usageInfo (String -> String
header String
name) [OptDescr Flag]
Flag.options
    IO ()
forall a. IO a
Exit.exitSuccess
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (Config -> Bool
Config.version (Config -> Bool) -> Config -> Bool
forall a b. (a -> b) -> a -> b
$ Context -> Config
Context.config Context
context) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
    String -> IO ()
putStrLn String
Version.string
    IO ()
forall a. IO a
Exit.exitSuccess
  [String]
files <-
    Depth -> String -> IO [String]
Directory.list (Config -> Depth
Config.depth (Config -> Depth) -> Config -> Depth
forall a b. (a -> b) -> a -> b
$ Context -> Config
Context.config Context
context)
    (String -> IO [String])
-> (String -> String) -> String -> IO [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
FilePath.dropExtension
    (String -> IO [String]) -> String -> IO [String]
forall a b. (a -> b) -> a -> b
$ Context -> String
Context.source Context
context
  String -> String -> IO ()
writeFile (Context -> String
Context.output Context
context) (String -> IO ()) -> String -> IO ()
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 String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" SOURCE INPUT OUTPUT"