diff --git a/.gitignore b/.gitignore index 8d98f9d..96dded3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .* +quik-connector.config.json diff --git a/app/Main.hs b/app/Main.hs index d64b244..7bce452 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -1,7 +1,7 @@ +{-# LANGUAGE OverloadedStrings #-} module Main where import Lib -import QuoteSource.DDE import QuoteSource.DataImport import Control.Concurrent hiding (readChan) import Control.Monad @@ -13,11 +13,68 @@ import Data.ATrade import QuoteSource.TableParsers.AllParamsTableParser import QuoteSource.TableParser -callback :: DdeCallback -callback = undefined +import System.Log.Logger +import System.Log.Handler.Simple +import System.Log.Handler (setFormatter) +import System.Log.Formatter + +import Data.Aeson +import Data.Aeson.Types +import qualified Data.ByteString.Lazy as BL +import qualified Data.HashMap.Strict as HM +import qualified Data.Vector as V +import qualified Data.Text as T + +data TableConfig = TableConfig { + parserId :: String, + tableName :: String, + tableParams :: Value +} deriving (Show) + +data Config = Config { + quotesourceEndpoint :: String, + brokerserverEndpoint :: String, + tables :: [TableConfig] +} deriving (Show) + +readConfig :: String -> IO Config +readConfig fname = do + content <- BL.readFile fname + case decode content >>= parseMaybe parseConfig of + Just config -> return config + Nothing -> error "Unable to load config" + +parseConfig :: Value -> Parser Config +parseConfig = withObject "object" $ \obj -> do + qse <- obj .: "quotesource-endpoint" + bse <- obj .: "brokerserver-endpoint" + rt <- case HM.lookup "tables" obj of + Just v -> parseTables v + Nothing -> fail "Expected tables array" + return Config { quotesourceEndpoint = qse, + brokerserverEndpoint = bse, + tables = rt } + where + parseTables :: Value -> Parser [TableConfig] + parseTables = withArray "array" $ \arr -> mapM parseTableConfig (V.toList arr) + + parseTableConfig :: Value -> Parser TableConfig + parseTableConfig = withObject "object" $ \obj -> do + pid <- obj .: "parser-id" + tn <- obj .: "table-name" + params <- case HM.lookup "params" obj of + Just x -> return x + Nothing -> return $ Object HM.empty + return TableConfig { + parserId = pid, + tableName = tn, + tableParams = params } + main :: IO () main = do + config <- readConfig "quik-connector.config.json" + print config chan <- newBoundedChan 1000 forkIO $ forever $ do tick <- readChan chan diff --git a/quik-connector.cabal b/quik-connector.cabal index 68473a3..848cd5b 100644 --- a/quik-connector.cabal +++ b/quik-connector.cabal @@ -16,7 +16,6 @@ cabal-version: >=1.10 library hs-source-dirs: src exposed-modules: Lib - , QuoteSource.DDE , QuoteSource.DataImport , Data.ATrade , QuoteSource.TableParser @@ -36,9 +35,11 @@ library , mtl , datetime , BoundedChan + , hslogger default-language: Haskell2010 extra-libraries: "user32" - other-modules: QuoteSource.XlParser + other-modules: System.Win32.XlParser + , System.Win32.DDE executable quik-connector-exe hs-source-dirs: app @@ -49,6 +50,12 @@ executable quik-connector-exe , Win32 , gtk , BoundedChan + , hslogger + , aeson + , bytestring + , unordered-containers + , vector + , text default-language: Haskell2010 extra-libraries: "user32"