module Main (main) where import ATrade (libatrade_gitrev, libatrade_version) import ATrade.Logging (Message (..), Severity (Info), logWith) import ATrade.Logging (fmtMessage) import ATrade.QuoteSource.Server (startQuoteSourceServer, stopQuoteSourceServer) import ATrade.Types (defaultServerSecurityParams) import Colog (LogAction, logTextStdout, (>$<)) import Colog.Actions (logTextHandle) import Config (TransaqConnectorConfig (..), loadConfig) import Control.Concurrent (threadDelay) import Control.Concurrent.BoundedChan (newBoundedChan) import Control.Exception (bracket) import Control.Monad (forever, void) import Control.Monad.IO.Class (MonadIO) import qualified Data.Text as T import Data.Version (showVersion) import Debug.EventCounters (initEventCounters) import Prelude hiding (log) import System.IO (Handle, IOMode (AppendMode), withFile) import System.ZMQ4 (withContext) import TickerInfoServer (withTickerInfoServer) import qualified TXMLConnector as Connector import Version (transaqConnectorVersionText) mkLogger :: (MonadIO m) => Handle -> LogAction m Message mkLogger h = fmtMessage >$< (logTextStdout <> logTextHandle h) main :: IO () main = do initEventCounters cfg <- loadConfig "transaq-connector.dhall" withFile "transaq-connector.log" AppendMode $ \logH -> do let logger = mkLogger logH let log = logWith logger log Info "main" $ "Starting transaq-connector-" <> transaqConnectorVersionText <> "; libatrade-" <> (T.pack . showVersion) libatrade_version <> "(" <> T.pack libatrade_gitrev <> ")" void $ withContext $ \ctx -> do qssChannel <- newBoundedChan 50000 bracket (startQuoteSourceServer qssChannel ctx (quotesourceEndpoint cfg) defaultServerSecurityParams) stopQuoteSourceServer $ \_ -> withTickerInfoServer logger ctx (tisEndpoint cfg) $ \tisH -> do void $ Connector.start logger cfg qssChannel tisH forever $ threadDelay 1000000 log Info "main" "Shutting down"