10 #include <boost/algorithm/string/predicate.hpp> 22 static XmlRpcValueCreator createArray(
const std::vector<XmlRpcValue>&
values)
24 XmlRpcValueCreator ret;
25 ret._type = TypeArray;
26 ret._value.asArray =
new ValueArray(values);
31 static XmlRpcValueCreator createStruct(
const std::map<std::string, XmlRpcValue>& members)
33 XmlRpcValueCreator ret;
34 ret._type = TypeStruct;
35 ret._value.asStruct =
new std::map<std::string, XmlRpcValue>(members);
43 if(n.Type() != YAML::NodeType::Scalar)
47 case YAML::NodeType::Map:
49 std::map<std::string, XmlRpc::XmlRpcValue> members;
52 for(YAML::const_iterator it = n.begin(); it != n.end(); ++it)
54 auto key = it->first.as<std::string>();
59 throw std::runtime_error{
"Expected a struct here"};
61 for(
auto& pair : merger)
62 members[pair.first] = pair.second;
67 for(YAML::const_iterator it = n.begin(); it != n.end(); ++it)
69 auto key = it->first.as<std::string>();
76 return XmlRpcValueCreator::createStruct(members);
78 case YAML::NodeType::Sequence:
80 std::vector<XmlRpc::XmlRpcValue>
values;
81 for(YAML::const_iterator it = n.begin(); it != n.end(); ++it)
85 return XmlRpcValueCreator::createArray(values);
88 throw ctx.
error(
"Invalid YAML node type");
96 if(n.Tag() ==
"tag:yaml.org,2002:int")
98 if(n.Tag() ==
"tag:yaml.org,2002:float")
100 if(n.Tag() ==
"tag:yaml.org,2002:bool")
102 if(n.Tag() ==
"tag:yaml.org,2002:str")
104 if(n.Tag() ==
"tag:yaml.org,2002:binary")
106 auto binary = n.as<YAML::Binary>();
110 std::vector<unsigned char> copy(binary.data(), binary.data()+binary.size());
116 if(n.Tag() ==
"!degrees")
127 if(n.Tag() ==
"!radians")
147 catch(YAML::Exception&) {}
150 catch(YAML::Exception&) {}
153 catch(YAML::Exception&) {}
157 std::string str = n.as<std::string>();
162 if(boost::starts_with(str,
"deg(") && boost::ends_with(str,
")"))
177 if(boost::starts_with(str,
"rad(") && boost::ends_with(str,
")"))
192 catch(YAML::Exception&) {}
194 throw ctx.
error(
"Could not convert YAML value");
virtual const char * what() const noexcept override
ParseException error(const char *fmt, const Args &... args) const
double evaluateROSParamPython(const std::string &input)
Evaluate a deg(...) rosparam expression.
XmlRpc::XmlRpcValue yamlToXmlRpc(const ParseContext &ctx, const YAML::Node &n)
std::string arg(const std::string &name, const ParseContext &context)
std::string strip(const std::string &input)