Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
secondary_config.h
1 #ifndef SECONDARY_CONFIG_H_
2 #define SECONDARY_CONFIG_H_
3 
4 #include <json/json.h>
5 #include <boost/filesystem.hpp>
6 #include <unordered_map>
7 
8 #include "primary/secondary_config.h"
9 #include "virtualsecondary.h"
10 
11 namespace Primary {
12 
14  public:
15  static constexpr const char* const AddrField{"addr"};
16 
17  IPSecondaryConfig(std::string addr_ip, uint16_t addr_port) : ip(std::move(addr_ip)), port(addr_port) {}
18 
19  friend std::ostream& operator<<(std::ostream& os, const IPSecondaryConfig& cfg) {
20  os << "(addr: " << cfg.ip << ":" << cfg.port << ")";
21  return os;
22  }
23 
24  public:
25  const std::string ip;
26  const uint16_t port;
27 };
28 
30  public:
31  static const char* const Type;
32  static constexpr const char* const PortField{"secondaries_wait_port"};
33  static constexpr const char* const TimeoutField{"secondaries_wait_timeout"};
34  static constexpr const char* const SecondariesField{"secondaries"};
35 
36  IPSecondariesConfig(const uint16_t wait_port, const int timeout_s)
37  : SecondaryConfig(Type), secondaries_wait_port{wait_port}, secondaries_timeout_s{timeout_s} {}
38 
39  friend std::ostream& operator<<(std::ostream& os, const IPSecondariesConfig& cfg) {
40  os << "(wait_port: " << cfg.secondaries_wait_port << " timeout_s: " << cfg.secondaries_timeout_s << ")";
41  return os;
42  }
43 
44  public:
45  const uint16_t secondaries_wait_port;
46  const int secondaries_timeout_s;
47  std::vector<IPSecondaryConfig> secondaries_cfg;
48 };
49 
51  public:
52  using Configs = std::vector<std::shared_ptr<SecondaryConfig>>;
53 
54  static Configs parse_config_file(const boost::filesystem::path& config_file);
55  virtual ~SecondaryConfigParser() = default;
56 
57  // TODO implement iterator instead of parse
58  virtual Configs parse() = 0;
59 };
60 
62  public:
63  JsonConfigParser(const boost::filesystem::path& config_file);
64 
65  Configs parse() override;
66 
67  private:
68  static void createIPSecondariesCfg(Configs& configs, const Json::Value& json_ip_sec_cfg);
69  static void createVirtualSecondariesCfg(Configs& configs, const Json::Value& json_virtual_sec_cfg);
70  // add here a factory method for another type of secondary config
71 
72  private:
73  using SecondaryConfigFactoryRegistry = std::unordered_map<std::string, std::function<void(Configs&, Json::Value&)>>;
74 
75  SecondaryConfigFactoryRegistry sec_cfg_factory_registry_ = {
76  {IPSecondariesConfig::Type, createIPSecondariesCfg}, {VirtualSecondaryConfig::Type, createVirtualSecondariesCfg}
77  // add here factory method for another type of secondary config
78  };
79 
80  Json::Value root_;
81 };
82 
83 } // namespace Primary
84 
85 #endif // SECONDARY_CONFIG_H_
Primary::SecondaryConfig
Definition: secondary_config.h:6
Primary::JsonConfigParser
Definition: secondary_config.h:61
Primary::IPSecondariesConfig
Definition: secondary_config.h:29
Primary::IPSecondaryConfig
Definition: secondary_config.h:13
Primary::SecondaryConfigParser
Definition: secondary_config.h:50