5 changed files with 131 additions and 118 deletions
@ -0,0 +1,91 @@ |
|||||||
|
{-# LANGUAGE OverloadedStrings, OverloadedLabels #-} |
||||||
|
|
||||||
|
module Config ( |
||||||
|
TableConfig(..), |
||||||
|
Config(..), |
||||||
|
readConfig |
||||||
|
|
||||||
|
) where |
||||||
|
|
||||||
|
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, |
||||||
|
whitelist :: [T.Text], |
||||||
|
blacklist :: [T.Text], |
||||||
|
brokerServerCertPath :: Maybe FilePath, |
||||||
|
brokerClientCertificateDir :: Maybe FilePath, |
||||||
|
tables :: [TableConfig], |
||||||
|
quikPath :: String, |
||||||
|
dllPath :: String, |
||||||
|
quikAccounts :: [T.Text], |
||||||
|
tradeSink :: T.Text, |
||||||
|
telegramToken :: T.Text, |
||||||
|
telegramChatId :: T.Text |
||||||
|
} 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" |
||||||
|
whitelist' <- obj .:? "whitelist" .!= [] |
||||||
|
blacklist' <- obj .:? "blacklist" .!= [] |
||||||
|
serverCert <- obj .:? "broker_server_certificate" |
||||||
|
clientCerts <- obj .:? "broker_client_certificates" |
||||||
|
rt <- case HM.lookup "tables" obj of |
||||||
|
Just v -> parseTables v |
||||||
|
Nothing -> fail "Expected tables array" |
||||||
|
qp <- obj .: "quik-path" |
||||||
|
dp <- obj .: "dll-path" |
||||||
|
trsink <- obj .: "trade-sink" |
||||||
|
tgToken <- obj .: "telegram-token" |
||||||
|
tgChatId <- obj .: "telegram-chatid" |
||||||
|
accs <- V.toList <$> obj .: "accounts" |
||||||
|
return Config { quotesourceEndpoint = qse, |
||||||
|
brokerserverEndpoint = bse, |
||||||
|
whitelist = whitelist', |
||||||
|
blacklist = blacklist', |
||||||
|
brokerServerCertPath = serverCert, |
||||||
|
brokerClientCertificateDir = clientCerts, |
||||||
|
tables = rt, |
||||||
|
quikPath = qp, |
||||||
|
dllPath = dp, |
||||||
|
quikAccounts = fmap T.pack accs, |
||||||
|
tradeSink = trsink, |
||||||
|
telegramToken = tgToken, |
||||||
|
telegramChatId = tgChatId } |
||||||
|
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 } |
||||||
|
|
||||||
Loading…
Reference in new issue