|
| 1 | +{-# LANGUAGE OverloadedStrings #-} |
| 2 | + |
| 3 | +import Paths_poseidon_hs (version) |
| 4 | +import Poseidon.CLI.Trident.OptparseApplicativeParsers |
| 5 | +import Poseidon.CLI.Trident.Serve (ServeOptions (..), |
| 6 | + runServerMainThread) |
| 7 | +import Poseidon.Core.PoseidonVersion (showPoseidonVersion, |
| 8 | + validPoseidonVersions) |
| 9 | +import Poseidon.Core.Utils (ErrorLength (..), |
| 10 | + LogMode (..), |
| 11 | + PlinkPopNameMode (..), |
| 12 | + PoseidonException (..), |
| 13 | + TestMode, |
| 14 | + logError, |
| 15 | + renderPoseidonException, |
| 16 | + usePoseidonLogger) |
| 17 | + |
| 18 | +import Control.Applicative ((<|>)) |
| 19 | +import Control.Exception (catch) |
| 20 | +import Data.List (intercalate) |
| 21 | +import Data.Version (showVersion) |
| 22 | +import qualified Options.Applicative as OP |
| 23 | +import System.Exit (exitFailure) |
| 24 | +import System.IO (hPutStrLn, |
| 25 | + stderr) |
| 26 | + |
| 27 | +data Options = Options |
| 28 | + { _logMode :: LogMode |
| 29 | + , _testMode :: TestMode |
| 30 | + , _errLength :: ErrorLength |
| 31 | + , _plinkMode :: PlinkPopNameMode |
| 32 | + , _serveOptions :: ServeOptions |
| 33 | + } |
| 34 | + |
| 35 | +main :: IO () |
| 36 | +main = do |
| 37 | + hPutStrLn stderr renderVersion |
| 38 | + hPutStrLn stderr "" |
| 39 | + Options logMode testMode errLength plinkMode serveOptions <- |
| 40 | + OP.customExecParser (OP.prefs OP.showHelpOnEmpty) optParserInfo |
| 41 | + catch (usePoseidonLogger logMode testMode plinkMode errLength $ runServerMainThread serveOptions) |
| 42 | + (handler logMode testMode plinkMode errLength) |
| 43 | + where |
| 44 | + handler :: LogMode -> TestMode -> PlinkPopNameMode -> ErrorLength -> PoseidonException -> IO () |
| 45 | + handler l t pm len e = do |
| 46 | + usePoseidonLogger l t pm len $ logError $ renderPoseidonException e |
| 47 | + exitFailure |
| 48 | + |
| 49 | +optParserInfo :: OP.ParserInfo Options |
| 50 | +optParserInfo = OP.info |
| 51 | + (OP.helper <*> versionOption <*> optionsParser) |
| 52 | + ( OP.briefDesc <> OP.progDesc "Poseidon webserver") |
| 53 | + |
| 54 | +optionsParser :: OP.Parser Options |
| 55 | +optionsParser = |
| 56 | + Options |
| 57 | + <$> (parseLogMode <|> parseDebugMode) |
| 58 | + <*> parseTestMode |
| 59 | + <*> parseErrorLength |
| 60 | + <*> parseInputPlinkPopMode |
| 61 | + <*> serveOptParser |
| 62 | + |
| 63 | +versionOption :: OP.Parser (a -> a) |
| 64 | +versionOption = |
| 65 | + OP.infoOption |
| 66 | + (showVersion version) |
| 67 | + (OP.long "version" <> OP.help "Show version number") |
| 68 | + |
| 69 | +renderVersion :: String |
| 70 | +renderVersion = |
| 71 | + "poseidon-server v" ++ showVersion version ++ " for poseidon v" ++ |
| 72 | + intercalate ", v" (map showPoseidonVersion validPoseidonVersions) ++ "\n" ++ |
| 73 | + "https://poseidon-framework.github.io" |
| 74 | + |
| 75 | +serveOptParser :: OP.Parser ServeOptions |
| 76 | +serveOptParser = |
| 77 | + ServeOptions |
| 78 | + <$> parseArchiveConfig |
| 79 | + <*> parseMaybeZipDir |
| 80 | + <*> parsePort |
| 81 | + <*> parseIgnoreChecksums |
| 82 | + <*> parseMaybeCertFiles |
0 commit comments