9 #include "../common/JsonProcessingFunctions.hpp"
10 #include "../common/TomlProcessingFunctions.hpp"
11 #include "../common/addTargets.hpp"
17 #include <type_traits>
19 namespace helics::fileops {
22 void makeConnectionsToml(brkX* brk,
const std::string& file)
25 static_assert(std::is_base_of<Broker, brkX>::value || std::is_base_of<Core, brkX>::value,
26 "broker must be Core or broker");
31 catch (
const std::invalid_argument& ia) {
35 auto conns = toml::find_or(doc,
"connections", uVal);
36 if (!conns.is_empty()) {
37 auto& connArray = conns.as_array();
38 for (
const auto& conn : connArray) {
39 if (conn.is_array()) {
40 auto& connAct = conn.as_array();
41 brk->dataLink(connAct[0].as_string(), connAct[1].as_string());
43 std::string pub = getOrDefault(conn,
"publication", std::string());
45 addTargets(conn,
"targets", [brk, &pub](
const std::string& target) {
46 brk->dataLink(pub, target);
49 std::string ipt = getOrDefault(conn,
"input", std::string());
51 addTargets(conn,
"targets", [brk, &ipt](
const std::string& target) {
52 brk->dataLink(target, ipt);
54 addTargets(conn,
"sources", [brk, &ipt](
const std::string& source) {
55 brk->dataLink(source, ipt);
58 std::string ept = getOrDefault(conn,
"endpoint", std::string());
60 addTargets(conn,
"targets", [brk, &ept](
const std::string& target) {
61 brk->linkEndpoints(ept, target);
63 addTargets(conn,
"sources", [brk, &ept](
const std::string& source) {
64 brk->linkEndpoints(source, ept);
72 auto lnks = toml::find_or(doc,
"links", uVal);
73 if (!lnks.is_empty()) {
74 auto& connArray = lnks.as_array();
75 for (
const auto& conn : connArray) {
76 if (conn.is_array()) {
77 auto& connAct = conn.as_array();
78 brk->linkEndpoints(connAct[0].as_string(), connAct[1].as_string());
80 std::string pub = getOrDefault(conn,
"publication", std::string());
82 addTargets(conn,
"targets", [brk, &pub](
const std::string& target) {
83 brk->dataLink(pub, target);
86 std::string ipt = getOrDefault(conn,
"input", std::string());
88 addTargets(conn,
"targets", [brk, &ipt](
const std::string& target) {
89 brk->dataLink(target, ipt);
91 addTargets(conn,
"sources", [brk, &ipt](
const std::string& source) {
92 brk->dataLink(source, ipt);
95 std::string ept = getOrDefault(conn,
"endpoint", std::string());
97 addTargets(conn,
"targets", [brk, &ept](
const std::string& target) {
98 brk->linkEndpoints(ept, target);
100 addTargets(conn,
"sources", [brk, &ept](
const std::string& source) {
101 brk->linkEndpoints(source, ept);
109 auto filts = toml::find_or(doc,
"filters", uVal);
110 if (!filts.is_empty()) {
111 auto& filtArray = filts.as_array();
112 for (
const auto& filt : filtArray) {
113 if (filt.is_array()) {
114 auto& filtAct = filt.as_array();
115 brk->addSourceFilterToEndpoint(filtAct[0].as_string(), filtAct[1].as_string());
117 std::string fname = getOrDefault(filt,
"filter", std::string());
118 if (!fname.empty()) {
119 auto asrc = [brk, &fname](
const std::string& ept) {
120 brk->addSourceFilterToEndpoint(fname, ept);
122 addTargets(filt,
"endpoints", asrc);
123 addTargets(filt,
"source_endpoints", asrc);
124 addTargets(filt,
"sourceEndpoints", asrc);
125 auto adst = [brk, &fname](
const std::string& ept) {
126 brk->addDestinationFilterToEndpoint(fname, ept);
128 addTargets(filt,
"dest_endpoints", adst);
129 addTargets(filt,
"destEndpoints", adst);
134 auto globals = toml::find_or(doc,
"globals", uVal);
135 if (!globals.is_empty()) {
136 if (globals.is_array()) {
137 for (
auto& val : globals.as_array()) {
138 brk->setGlobal(val.as_array()[0].as_string(), val.as_array()[1].as_string());
141 for (
const auto& val : globals.as_table()) {
142 brk->setGlobal(val.first, val.second.as_string());
146 auto aliases = toml::find_or(doc,
"aliases", uVal);
147 if (!aliases.is_empty()) {
148 if (aliases.is_array()) {
149 for (
auto& val : aliases.as_array()) {
150 brk->addAlias(val.as_array()[0].as_string(), val.as_array()[1].as_string());
153 for (
const auto& val : aliases.as_table()) {
154 brk->addAlias(val.first, val.second.as_string());
161 void makeConnectionsJson(brkX* brk,
const std::string& file)
163 static_assert(std::is_base_of<Broker, brkX>::value || std::is_base_of<Core, brkX>::value,
164 "input must be Core or Broker");
167 doc = loadJson(file);
169 catch (
const std::invalid_argument& ia) {
173 if (doc.contains(
"connections")) {
174 for (
const auto& conn : doc[
"connections"]) {
175 if (conn.is_array() && conn.size() >= 2) {
176 brk->dataLink(conn[0].get<std::string>(), conn[1].get<std::string>());
178 std::string pub = fileops::getOrDefault(conn,
"publication", std::string_view());
180 addTargets(conn,
"targets", [brk, &pub](std::string_view target) {
181 brk->dataLink(pub, target);
184 std::string ipt = fileops::getOrDefault(conn,
"input", std::string_view());
186 addTargets(conn,
"targets", [brk, &ipt](std::string_view target) {
187 brk->dataLink(target, ipt);
189 addTargets(conn,
"sources", [brk, &ipt](std::string_view source) {
190 brk->dataLink(source, ipt);
194 fileops::getOrDefault(conn,
"endpoint", std::string_view());
196 addTargets(conn,
"targets", [brk, &ept](std::string_view target) {
197 brk->linkEndpoints(ept, target);
199 addTargets(conn,
"sources", [brk, &ept](std::string_view source) {
200 brk->linkEndpoints(source, ept);
208 if (doc.contains(
"links")) {
209 for (
const auto& conn : doc[
"links"]) {
210 if (conn.is_array() && conn.size() >= 2) {
211 brk->linkEndpoints(conn[0].get<std::string>(), conn[1].get<std::string>());
213 std::string pub = fileops::getOrDefault(conn,
"publication", std::string_view());
215 addTargets(conn,
"targets", [brk, &pub](std::string_view target) {
216 brk->dataLink(pub, target);
219 std::string ipt = fileops::getOrDefault(conn,
"input", std::string());
221 addTargets(conn,
"targets", [brk, &ipt](std::string_view target) {
222 brk->dataLink(target, ipt);
224 addTargets(conn,
"sources", [brk, &ipt](std::string_view source) {
225 brk->dataLink(source, ipt);
228 std::string ept = fileops::getOrDefault(conn,
"endpoint", std::string());
230 addTargets(conn,
"targets", [brk, &ept](std::string_view target) {
231 brk->linkEndpoints(ept, target);
233 addTargets(conn,
"sources", [brk, &ept](std::string_view source) {
234 brk->linkEndpoints(source, ept);
242 if (doc.contains(
"filters")) {
243 for (
const auto& filt : doc[
"filters"]) {
244 if (filt.is_array()) {
245 brk->addSourceFilterToEndpoint(filt[0].get<std::string>(),
246 filt[1].get<std::string>());
248 std::string fname = fileops::getOrDefault(filt,
"filter", std::string_view());
249 if (!fname.empty()) {
250 auto asrc = [brk, &fname](std::string_view ept) {
251 brk->addSourceFilterToEndpoint(fname, ept);
253 addTargets(filt,
"endpoints", asrc);
254 addTargets(filt,
"source_endpoints", asrc);
255 addTargets(filt,
"sourceEndpoints", asrc);
256 auto adst = [brk, &fname](std::string_view ept) {
257 brk->addDestinationFilterToEndpoint(fname, ept);
259 addTargets(filt,
"dest_endpoints", adst);
260 addTargets(filt,
"destEndpoints", adst);
265 if (doc.contains(
"globals")) {
266 if (doc[
"globals"].is_array()) {
267 for (
const auto& val : doc[
"globals"]) {
268 brk->setGlobal(val[0].get<std::string>(), val[1].get<std::string>());
271 for (
const auto& member : doc[
"globals"].items()) {
272 brk->setGlobal(member.key(), member.value().get<std::string>());
277 if (doc.contains(
"aliases")) {
278 if (doc[
"aliases"].is_array()) {
279 for (
const auto& val : doc[
"aliases"]) {
280 brk->addAlias(val[0].get<std::string>(), val[1].get<std::string>());
283 for (
const auto& member : doc[
"aliases"].items()) {
284 brk->addAlias(member.key(), member.value().get<std::string>());
289 if constexpr (std::is_base_of<Core, brkX>::value) {
290 loadTags(doc, [brk](std::string_view tagname, std::string_view tagvalue) {
toml::value loadToml(const std::string &tomlString)
Definition: core-exceptions.hpp:47
constexpr LocalFederateId gLocalCoreId(-259)