packages feed

pty-mcp-server-0.0.1.0: app/Main.hs

module Main where

import System.IO
import System.Exit
import Options.Applicative
import qualified Control.Exception.Safe as E

import qualified PMS.Application.Service.App.Control as A
import qualified PMS.Application.Service.DM.Type as A
import qualified PMS.UI.Request.App.Control as URQ
import qualified PMS.UI.Response.App.Control as URS
import qualified PMS.Infrastructure.App.Control as INF
import qualified PMS.Domain.Service.App.Control as DSR

-- |
--
main :: IO ()
main = getArgs >>= \args -> do
  let apps = [URQ.run, URS.run, INF.run, DSR.run]
  flip E.catchAny exception
     $ flip E.finally finalize
       $ A.run args apps

  where
    finalize = do
      hPutStrLn stderr "-----------------------------------------------------------------------------"
      hPutStrLn stderr "Finalize called."
      hPutStrLn stderr "-----------------------------------------------------------------------------"

    exception e = do
      hPutStrLn stderr "-----------------------------------------------------------------------------"
      hPutStrLn stderr "ERROR exit."
      hPutStrLn stderr $ show e
      hPutStrLn stderr "-----------------------------------------------------------------------------"
      exitFailure

-------------------------------------------------------------------------------
-- |
--   optparse-applicative
--
getArgs :: IO A.ArgData
getArgs = execParser parseInfo

-- |
--
parseInfo :: ParserInfo A.ArgData
parseInfo = info options $ mconcat
  [ fullDesc
  , header   "This is app program."
  , footer   "Copyright 2025. All Rights Reserved."
  , progDesc "This is app program description."
  ]

-- |
--
options :: Parser A.ArgData
options = (<*>) helper
  $ A.ArgData
  <$> confOption

-- |
--
confOption :: Parser (Maybe FilePath)
confOption = optional $ strOption $ mconcat
  [ short 'y', long "yaml"
  , help "config file"
  , metavar "FILE"
  ]