Skip to content

Commit

Permalink
Extract some objects creation functions from main to make code usable…
Browse files Browse the repository at this point in the history
… as external library
  • Loading branch information
sjanel committed May 8, 2023
1 parent 5d2050a commit e53ea0b
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 69 deletions.
3 changes: 0 additions & 3 deletions src/engine/include/coincentercommands.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ class CoincenterCommands {

static CoincenterCmdLineOptions ParseOptions(int argc, const char *argv[]);

static MonitoringInfo CreateMonitoringInfo(std::string_view programName,
const CoincenterCmdLineOptions &cmdLineOptions);

/// @brief Set this CoincenterCommands from given command line options.
/// @return false if only help or version is asked, true otherwise
bool setFromOptions(const CoincenterCmdLineOptions &cmdLineOptions);
Expand Down
16 changes: 16 additions & 0 deletions src/engine/include/coincenterinfo_create.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once

#include <string_view>

#include "coincenterinfo.hpp"
#include "coincenteroptions.hpp"
#include "exchangesecretsinfo.hpp"
#include "runmodes.hpp"

namespace cct {
CoincenterInfo CoincenterInfo_Create(std::string_view programName, const CoincenterCmdLineOptions &cmdLineOptions,
settings::RunMode runMode);

ExchangeSecretsInfo ExchangeSecretsInfo_Create(const CoincenterCmdLineOptions &cmdLineOptions);

} // namespace cct
7 changes: 0 additions & 7 deletions src/engine/src/coincentercommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,6 @@ CoincenterCmdLineOptions CoincenterCommands::ParseOptions(int argc, const char *
return parsedOptions;
}

MonitoringInfo CoincenterCommands::CreateMonitoringInfo(std::string_view programName,
const CoincenterCmdLineOptions &cmdLineOptions) {
return {cmdLineOptions.useMonitoring, programName,
cmdLineOptions.monitoringAddress, cmdLineOptions.monitoringPort,
cmdLineOptions.monitoringUsername, cmdLineOptions.monitoringPassword};
}

namespace {
std::pair<OrdersConstraints, ExchangeNames> ParseOrderRequest(const CoincenterCmdLineOptions &cmdLineOptions,
std::string_view orderRequestStr) {
Expand Down
72 changes: 72 additions & 0 deletions src/engine/src/coincenterinfo_create.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include "coincenterinfo_create.hpp"

#include "durationstring.hpp"
#include "file.hpp"
#include "stringoptionparser.hpp"

namespace cct {

namespace {
json LoadGeneralConfigAndOverrideOptionsFromCLI(const CoincenterCmdLineOptions &cmdLineOptions) {
json generalConfigData = GeneralConfig::LoadFile(cmdLineOptions.dataDir);

// Override general config options from CLI
if (!cmdLineOptions.apiOutputType.empty()) {
generalConfigData["apiOutputType"] = cmdLineOptions.apiOutputType;
}
if (!cmdLineOptions.logConsole.empty()) {
generalConfigData["log"]["console"] = string(cmdLineOptions.logConsole);
}
if (!cmdLineOptions.logFile.empty()) {
generalConfigData["log"]["file"] = string(cmdLineOptions.logFile);
}

return generalConfigData;
}

MonitoringInfo MonitoringInfo_Create(std::string_view programName, const CoincenterCmdLineOptions &cmdLineOptions) {
return {cmdLineOptions.useMonitoring, programName,
cmdLineOptions.monitoringAddress, cmdLineOptions.monitoringPort,
cmdLineOptions.monitoringUsername, cmdLineOptions.monitoringPassword};
}

} // namespace

CoincenterInfo CoincenterInfo_Create(std::string_view programName, const CoincenterCmdLineOptions &cmdLineOptions,
settings::RunMode runMode) {
json generalConfigData = LoadGeneralConfigAndOverrideOptionsFromCLI(cmdLineOptions);

Duration fiatConversionQueryRate = ParseDuration(generalConfigData["fiatConversion"]["rate"].get<std::string_view>());
ApiOutputType apiOutputType = ApiOutputTypeFromString(generalConfigData["apiOutputType"].get<std::string_view>());

// Create LoggingInfo first as it is a RAII structure re-initializing spdlog loggers.
// It will be held by GeneralConfig and then itself by CoincenterInfo though.
LoggingInfo loggingInfo(static_cast<const json &>(generalConfigData["log"]));

GeneralConfig generalConfig(std::move(loggingInfo), fiatConversionQueryRate, apiOutputType);

LoadConfiguration loadConfiguration(cmdLineOptions.dataDir, LoadConfiguration::ExchangeConfigFileType::kProd);

auto dataDir = loadConfiguration.dataDir();

File currencyAcronymsTranslatorFile(dataDir, File::Type::kStatic, "currencyacronymtranslator.json",
File::IfError::kThrow);
File stableCoinsFile(dataDir, File::Type::kStatic, "stablecoins.json", File::IfError::kThrow);
File currencyPrefixesTranslatorFile(dataDir, File::Type::kStatic, "currency_prefix_translator.json",
File::IfError::kThrow);

return CoincenterInfo(runMode, loadConfiguration, std::move(generalConfig),
MonitoringInfo_Create(programName, cmdLineOptions), currencyAcronymsTranslatorFile,
stableCoinsFile, currencyPrefixesTranslatorFile);
}

ExchangeSecretsInfo ExchangeSecretsInfo_Create(const CoincenterCmdLineOptions &cmdLineOptions) {
if (cmdLineOptions.noSecrets) {
StringOptionParser anyParser(*cmdLineOptions.noSecrets);

return ExchangeSecretsInfo(anyParser.getExchanges());
}
return {};
}

} // namespace cct
61 changes: 3 additions & 58 deletions src/main/src/processcommandsfromcli.cpp
Original file line number Diff line number Diff line change
@@ -1,75 +1,20 @@
#include "processcommandsfromcli.hpp"

#include "coincenter.hpp"
#include "coincenterinfo.hpp"
#include "coincenterinfo_create.hpp"
#include "curlhandle.hpp"
#include "durationstring.hpp"
#include "file.hpp"
#include "generalconfig.hpp"
#include "loadconfiguration.hpp"
#include "logginginfo.hpp"
#include "stringoptionparser.hpp"

namespace cct {

namespace {
json LoadGeneralConfigAndOverrideOptionsFromCLI(const CoincenterCmdLineOptions &cmdLineOptions) {
json generalConfigData = GeneralConfig::LoadFile(cmdLineOptions.dataDir);

// Override general config options from CLI
if (!cmdLineOptions.apiOutputType.empty()) {
generalConfigData["apiOutputType"] = cmdLineOptions.apiOutputType;
}
if (!cmdLineOptions.logConsole.empty()) {
generalConfigData["log"]["console"] = string(cmdLineOptions.logConsole);
}
if (!cmdLineOptions.logFile.empty()) {
generalConfigData["log"]["file"] = string(cmdLineOptions.logFile);
}

return generalConfigData;
}
} // namespace

void ProcessCommandsFromCLI(std::string_view programName, const CoincenterCommands &coincenterCommands,
const CoincenterCmdLineOptions &cmdLineOptions, settings::RunMode runMode) {
json generalConfigData = LoadGeneralConfigAndOverrideOptionsFromCLI(cmdLineOptions);

Duration fiatConversionQueryRate = ParseDuration(generalConfigData["fiatConversion"]["rate"].get<std::string_view>());
ApiOutputType apiOutputType = ApiOutputTypeFromString(generalConfigData["apiOutputType"].get<std::string_view>());

// Create LoggingInfo first as it is a RAII structure re-initializing spdlog loggers.
// It will be held by GeneralConfig and then itself by CoincenterInfo though.
LoggingInfo loggingInfo(static_cast<const json &>(generalConfigData["log"]));

GeneralConfig generalConfig(std::move(loggingInfo), fiatConversionQueryRate, apiOutputType);

LoadConfiguration loadConfiguration(cmdLineOptions.dataDir, LoadConfiguration::ExchangeConfigFileType::kProd);

auto dataDir = loadConfiguration.dataDir();

File currencyAcronymsTranslatorFile(dataDir, File::Type::kStatic, "currencyacronymtranslator.json",
File::IfError::kThrow);
File stableCoinsFile(dataDir, File::Type::kStatic, "stablecoins.json", File::IfError::kThrow);
File currencyPrefixesTranslatorFile(dataDir, File::Type::kStatic, "currency_prefix_translator.json",
File::IfError::kThrow);

// Should be outside the try / catch as it holds the RAII object managing the Logging (LoggingInfo)
CoincenterInfo coincenterInfo(runMode, loadConfiguration, std::move(generalConfig),
CoincenterCommands::CreateMonitoringInfo(programName, cmdLineOptions),
currencyAcronymsTranslatorFile, stableCoinsFile, currencyPrefixesTranslatorFile);

ExchangeSecretsInfo exchangesSecretsInfo;
if (cmdLineOptions.noSecrets) {
StringOptionParser anyParser(*cmdLineOptions.noSecrets);

exchangesSecretsInfo = ExchangeSecretsInfo(anyParser.getExchanges());
}
CoincenterInfo coincenterInfo = CoincenterInfo_Create(programName, cmdLineOptions, runMode);

CurlInitRAII curlInitRAII; // Should be before any curl query

try {
Coincenter coincenter(coincenterInfo, exchangesSecretsInfo);
Coincenter coincenter(coincenterInfo, ExchangeSecretsInfo_Create(cmdLineOptions));

int nbCommandsProcessed = coincenter.process(coincenterCommands);

Expand Down
8 changes: 7 additions & 1 deletion src/main/src/processcommandsfromcli.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@

#include "coincentercommands.hpp"
#include "coincenteroptions.hpp"
#include "exchangesecretsinfo.hpp"
#include "runmodes.hpp"

namespace cct {
CoincenterInfo CoincenterInfo_Create(std::string_view programName, const CoincenterCmdLineOptions &cmdLineOptions,
settings::RunMode runMode);

ExchangeSecretsInfo ExchangeSecretsInfo_Create(const CoincenterCmdLineOptions &cmdLineOptions);

void ProcessCommandsFromCLI(std::string_view programName, const CoincenterCommands &coincenterCommands,
const CoincenterCmdLineOptions &cmdLineOptions, settings::RunMode runMode);
}
} // namespace cct

0 comments on commit e53ea0b

Please sign in to comment.