packages feed

utxorpc-server-0.0.1.0: example/Main.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}

module Main (main) where

import qualified BuildImpl
import Data.List (find, isPrefixOf)
import Katip (Severity (..), closeScribes, logTM, ls)
import KatipLogger (katipLogger, mkLogEnv, unliftKatip)
import Network.GRPC.HTTP2.Encoding (Compression, gzip)
import Network.Wai.Handler.Warp (Settings, defaultSettings, setPort)
import Network.Wai.Handler.WarpTLS (TLSSettings, defaultTlsSettings)
import SimpleLogger (simpleLogger)
import qualified SubmitImpl
import qualified SyncImpl
import System.Environment (getArgs)
import UnliftIO (MonadIO, bracket)
import Utxorpc.Server (ServiceConfig (..), UtxorpcHandlers (UtxorpcHandlers), runUtxorpc)
import qualified WatchImpl

main :: IO ()
main = do
  args <- getArgs
  let port = maybe 3000 (read . drop 2) $ find ("-p" `isPrefixOf`) args
  putStrLn $ "Starting server on port " ++ show port
  if "--katip" `elem` args
    then runKatipExample defaultTlsSettings (setPort port defaultSettings) [gzip]
    else runSimpleExample

runKatipExample :: TLSSettings -> Settings -> [Compression] -> IO ()
runKatipExample tlsSettings warpSettings compression =
  bracket mkLogEnv closeScribes $ \le -> do
    runUtxorpc $ config le
  where
    config le =
      ServiceConfig
        tlsSettings
        warpSettings
        (handlersImpl katipLogF)
        (Just katipLogger)
        (unliftKatip le)
        compression

    katipLogF str = $(logTM) InfoS (ls str)

runSimpleExample :: IO ()
runSimpleExample = do
  runUtxorpc $
    ServiceConfig
      defaultTlsSettings
      defaultSettings
      (handlersImpl putStrLn)
      (Just simpleLogger)
      id
      [gzip]

handlersImpl :: (MonadIO m) => (String -> m ()) -> UtxorpcHandlers m Int Int Int Int Int
handlersImpl logF =
  UtxorpcHandlers
    (BuildImpl.handlerImpls logF)
    (SubmitImpl.handlerImpls logF)
    (SyncImpl.handlerImpls logF)
    (WatchImpl.handlerImpls logF)