packages feed

franz-0.2.1: app/server.hs

{-# LANGUAGE LambdaCase, RecordWildCards #-}
module Main where

import Data.List (foldl')
import Database.Franz.Network
import System.Environment
import System.Console.GetOpt
import System.Exit
import Network.Socket (PortNumber)

data Options = Options
  { port :: PortNumber
  , reaperInterval :: Double
  , streamLife :: Double
  }

defaultOptions :: Options
defaultOptions = Options
  { port = defaultPort
  , reaperInterval = 60
  , streamLife = 3600
  }

options :: [OptDescr (Options -> Options)]
options = [Option "p" ["port"] (ReqArg (\e o -> o { port = read e }) "NUM") "port number"
  , Option "l" ["life"] (ReqArg (\e o -> o { streamLife = read e }) "SECS") "lifespan of streams"]

main :: IO ()
main = getOpt Permute options <$> getArgs >>= \case
  (fs, args, []) -> do
    let Options{..} = foldl' (flip id) defaultOptions fs
    let start = startServer reaperInterval streamLife port
    case args of
      path : apath : _ -> start path (Just apath)
      path : _ -> start path Nothing
      [] -> start "." Nothing
  (_, _, es) -> do
    name <- getProgName
    die $ unlines ("franzd [-p PORT] PATH [ARCHIVE_PATH]" : es) ++ usageInfo name options