Allow plugins to create channels

This also fixes a bug, that prevented the usage of custom types with the
plugin config API.
This commit is contained in:
Dennis Klein
2018-10-30 15:54:57 +01:00
committed by Dennis Klein
parent 3b5b2b501f
commit 5e4876c947
5 changed files with 44 additions and 12 deletions

View File

@@ -162,7 +162,7 @@ int FairMQProgOptions::ParseAll(const int argc, char const* const* argv, bool al
else if (fVarMap.count("channel-config"))
{
LOG(debug) << "channel-config: Parsing channel configuration";
UpdateChannelMap(parser::SUBOPT().UserParser(fVarMap.at("channel-config").as<vector<string>>(), idForParser));
ParseChannelsFromCmdLine();
}
else
{
@@ -185,6 +185,23 @@ int FairMQProgOptions::ParseAll(const int argc, char const* const* argv, bool al
return 0;
}
void FairMQProgOptions::ParseChannelsFromCmdLine()
{
string idForParser;
// check if config-key for config parser is provided
if (fVarMap.count("config-key"))
{
idForParser = fVarMap["config-key"].as<string>();
}
else if (fVarMap.count("id"))
{
idForParser = fVarMap["id"].as<string>();
}
UpdateChannelMap(parser::SUBOPT().UserParser(fVarMap.at("channel-config").as<vector<string>>(), idForParser));
}
void FairMQProgOptions::ParseCmdLine(const int argc, char const* const* argv, bool allowUnregistered)
{
fVarMap.clear();

View File

@@ -59,13 +59,13 @@ class FairMQProgOptions
// update variable map
UpdateVarMap<typename std::decay<T>::type>(key, val);
// update FairMQChannel map if the key is a channel key
if (std::is_same<T, int>::value || std::is_same<T, std::string>::value)
if (key == "channel-config")
{
if (fChannelKeyMap.count(key))
{
UpdateChannelValue(fChannelKeyMap.at(key).channel, fChannelKeyMap.at(key).index, fChannelKeyMap.at(key).member, val);
}
ParseChannelsFromCmdLine();
}
else if (fChannelKeyMap.count(key))
{
UpdateChannelValue(fChannelKeyMap.at(key).channel, fChannelKeyMap.at(key).index, fChannelKeyMap.at(key).member, val);
}
lock.unlock();
@@ -210,6 +210,12 @@ class FairMQProgOptions
}
int UpdateChannelMap(const FairMQChannelMap& map);
template<typename T>
int UpdateChannelValue(const std::string&, int, const std::string&, T)
{
LOG(error) << "update of FairMQChannel map failed, because value type not supported";
return 1;
}
int UpdateChannelValue(const std::string& channelName, int index, const std::string& member, const std::string& val);
int UpdateChannelValue(const std::string& channelName, int index, const std::string& member, int val);
@@ -223,6 +229,7 @@ class FairMQProgOptions
vm[key].value() = boost::any(val);
}
void ParseChannelsFromCmdLine();
};
#endif /* FAIRMQPROGOPTIONS_H */