ClashModel.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #pragma once
  2. struct ClashProxySpeedHistory
  3. {
  4. // Date time; // FIXME
  5. uint32_t delay;
  6. friend void from_json(const nlohmann::json& j, ClashProxySpeedHistory& value) {
  7. JSON_FROM(delay);
  8. }
  9. };
  10. struct ClashProxy
  11. {
  12. using Name = std::string; // UTF-8
  13. enum struct Type
  14. {
  15. Unknown,
  16. URLTest,
  17. Fallback,
  18. LoadBalance,
  19. Selector,
  20. Direct,
  21. Reject,
  22. Shadowsocks,
  23. ShadowsocksR,
  24. Socks5,
  25. Http,
  26. Vmess,
  27. Snell,
  28. Trojan,
  29. Relay,
  30. };
  31. Name name;
  32. Type type = Type::Unknown;
  33. std::vector<Name> all;
  34. std::vector<ClashProxySpeedHistory> history;
  35. std::optional<Name> now;
  36. friend void from_json(const nlohmann::json& j, ClashProxy& value) {
  37. JSON_FROM(name);
  38. JSON_FROM(type);
  39. JSON_TRY_FROM(all);
  40. JSON_FROM(history);
  41. try { value.now.emplace(j.at("now").get<decltype(now)::value_type>()); }
  42. catch (...) {}
  43. }
  44. };
  45. NLOHMANN_JSON_SERIALIZE_ENUM(ClashProxy::Type, {
  46. {ClashProxy::Type::Unknown, nullptr},
  47. {ClashProxy::Type::URLTest, "URLTest"},
  48. {ClashProxy::Type::Fallback, "Fallback"},
  49. {ClashProxy::Type::LoadBalance, "LoadBalance"},
  50. {ClashProxy::Type::Selector, "Selector"},
  51. {ClashProxy::Type::Direct, "Direct"},
  52. {ClashProxy::Type::Reject, "Reject"},
  53. {ClashProxy::Type::Shadowsocks, "Shadowsocks"},
  54. {ClashProxy::Type::ShadowsocksR, "ShadowsocksR"},
  55. {ClashProxy::Type::Socks5, "Socks5"},
  56. {ClashProxy::Type::Http, "Http"},
  57. {ClashProxy::Type::Vmess, "Vmess"},
  58. {ClashProxy::Type::Snell, "Snell"},
  59. {ClashProxy::Type::Trojan, "Trojan"},
  60. {ClashProxy::Type::Relay, "Relay"},
  61. });
  62. struct ClashProxies
  63. {
  64. using MapType = std::unordered_map<ClashProxy::Name, ClashProxy>;
  65. MapType proxies;
  66. friend void from_json(const nlohmann::json& j, ClashProxies& value) {
  67. JSON_FROM(proxies);
  68. }
  69. };
  70. ClashProxies g_clashProxies;
  71. struct ClashProvider
  72. {
  73. using Name = std::string; // UTF-8
  74. enum struct Type
  75. {
  76. Unknown,
  77. Proxy,
  78. String,
  79. };
  80. enum struct VehicleType
  81. {
  82. Unknown,
  83. HTTP,
  84. File,
  85. Compatible,
  86. };
  87. Name name;
  88. std::vector<ClashProxy> proxies;
  89. Type type;
  90. VehicleType vehicleType;
  91. };
  92. NLOHMANN_JSON_SERIALIZE_ENUM(ClashProvider::Type, {
  93. {ClashProvider::Type::Unknown, nullptr},
  94. {ClashProvider::Type::Proxy, "Proxy"},
  95. {ClashProvider::Type::String, "String"},
  96. });
  97. NLOHMANN_JSON_SERIALIZE_ENUM(ClashProvider::VehicleType, {
  98. {ClashProvider::VehicleType::Unknown, nullptr},
  99. {ClashProvider::VehicleType::HTTP, "HTTP"},
  100. {ClashProvider::VehicleType::File, "File"},
  101. {ClashProvider::VehicleType::Compatible, "Compatible"},
  102. });
  103. struct ClashProviders
  104. {
  105. std::map<ClashProvider::Name, ClashProvider> providers;
  106. /*friend void from_json(const json& j, ClashProviders& value) {
  107. JSON_FROM(providers);
  108. }*/
  109. };
  110. enum struct ClashProxyMode
  111. {
  112. Unknown,
  113. Global,
  114. Rule,
  115. Direct
  116. };
  117. NLOHMANN_JSON_SERIALIZE_ENUM(ClashProxyMode, {
  118. {ClashProxyMode::Unknown, nullptr},
  119. {ClashProxyMode::Global, "global"},
  120. {ClashProxyMode::Rule, "rule"},
  121. {ClashProxyMode::Direct, "direct"},
  122. })
  123. enum struct ClashLogLevel
  124. {
  125. Unknown,
  126. Error,
  127. Warning,
  128. Info,
  129. Debug,
  130. Silent
  131. };
  132. NLOHMANN_JSON_SERIALIZE_ENUM(ClashLogLevel, {
  133. {ClashLogLevel::Unknown, nullptr},
  134. {ClashLogLevel::Error, "error"},
  135. {ClashLogLevel::Warning, "warning"},
  136. {ClashLogLevel::Info, "info"},
  137. {ClashLogLevel::Debug, "debug"},
  138. {ClashLogLevel::Silent, "silent"},
  139. }
  140. )
  141. struct ClashConfig
  142. {
  143. uint16_t port;
  144. uint16_t socksPort;
  145. uint16_t mixedPort;
  146. bool allowLan;
  147. ClashProxyMode mode;
  148. ClashLogLevel logLevel;
  149. friend void from_json(const nlohmann::json& j, ClashConfig& c) {
  150. j.at("port").get_to(c.port);
  151. j.at("socks-port").get_to(c.socksPort);
  152. j.at("mixed-port").get_to(c.mixedPort);
  153. j.at("allow-lan").get_to(c.allowLan);
  154. j.at("mode").get_to(c.mode);
  155. j.at("log-level").get_to(c.logLevel);
  156. }
  157. };