28 #include <ndn-cxx/encoding/nfd-constants.hpp>
29 #include <ndn-cxx/util/face-uri.hpp>
30 #include <ndn-cxx/util/logger.hpp>
47 return os <<
"non-negative integer";
49 return os <<
"string";
51 return os <<
"ReportFormat";
55 return os <<
"FaceUri";
57 return os <<
"FaceId or FaceUri";
59 return os <<
"FacePersistency";
61 return os << static_cast<int>(vt);
102 const std::string& metavar)
104 bool isNew = m_args.emplace(name,
105 Arg{name, valueType,
static_cast<bool>(isRequired),
109 if (static_cast<bool>(isRequired)) {
110 m_requiredArgs.insert(name);
113 if (static_cast<bool>(allowPositional)) {
115 m_positionalArgs.push_back(name);
129 size_t positionalArgIndex = 0;
130 for (
size_t i = start; i < tokens.size(); ++i) {
131 const std::string& token = tokens[i];
134 auto namedArg = m_args.find(token);
135 if (namedArg != m_args.end() && namedArg->second.valueType !=
ArgValueType::ANY) {
136 NDN_LOG_TRACE(token <<
" is a named argument");
137 const Arg& arg = namedArg->second;
140 NDN_LOG_TRACE(token <<
" is a boolean argument");
142 else if (i + 1 >= tokens.size()) {
143 BOOST_THROW_EXCEPTION(
Error(arg.name +
": " + arg.metavar +
" is missing"));
146 const std::string& valueToken = tokens[++i];
147 NDN_LOG_TRACE(arg.name <<
" has value " << valueToken);
149 ca[arg.name] = this->parseValue(arg.valueType, valueToken);
151 catch (
const std::exception& e) {
152 NDN_LOG_TRACE(valueToken <<
" cannot be parsed as " << arg.valueType);
153 BOOST_THROW_EXCEPTION(
Error(arg.name +
": cannot parse '" + valueToken +
"' as " +
154 arg.metavar +
" (" + e.what() +
")"));
156 NDN_LOG_TRACE(valueToken <<
" is parsed as " << arg.valueType);
160 positionalArgIndex = m_positionalArgs.size();
165 for (; positionalArgIndex < m_positionalArgs.size(); ++positionalArgIndex) {
166 const Arg& arg = m_args.at(m_positionalArgs[positionalArgIndex]);
169 std::vector<std::string> values;
170 std::copy(tokens.begin() + i, tokens.end(), std::back_inserter(values));
171 ca[arg.name] = values;
172 NDN_LOG_TRACE((tokens.size() - i) <<
" tokens are consumed for " << arg.name);
178 ca[arg.name] = this->parseValue(arg.valueType, token);
179 NDN_LOG_TRACE(token <<
" is parsed as value for " << arg.name);
182 catch (
const std::exception& e) {
183 if (arg.isRequired) {
184 NDN_LOG_TRACE(token <<
" cannot be parsed as value for " << arg.name);
185 BOOST_THROW_EXCEPTION(
Error(
"cannot parse '" + token +
"' as an argument name or as " +
186 arg.metavar +
" for " + arg.name +
" (" + e.what() +
")"));
190 NDN_LOG_TRACE(token <<
" cannot be parsed as value for " << arg.name);
195 if (positionalArgIndex >= m_positionalArgs.size()) {
198 BOOST_THROW_EXCEPTION(
Error(
"cannot parse '" + token +
"' as an argument name"));
202 ++positionalArgIndex;
205 for (
const std::string& argName : m_requiredArgs) {
206 if (ca.count(argName) == 0) {
207 BOOST_THROW_EXCEPTION(
Error(argName +
": required argument is missing"));
214 static ndn::nfd::FacePersistency
217 if (s ==
"persistent") {
218 return ndn::nfd::FACE_PERSISTENCY_PERSISTENT;
220 if (s ==
"permanent") {
221 return ndn::nfd::FACE_PERSISTENCY_PERMANENT;
223 BOOST_THROW_EXCEPTION(std::invalid_argument(
"unrecognized FacePersistency"));
227 CommandDefinition::parseValue(
ArgValueType valueType,
const std::string& token)
const
237 int64_t v = boost::lexical_cast<int64_t>(token);
239 BOOST_THROW_EXCEPTION(std::out_of_range(
"value is negative"));
241 return static_cast<uint64_t
>(v);
254 return ndn::util::FaceUri(token);
258 return boost::lexical_cast<uint64_t>(token);
260 catch (
const boost::bad_lexical_cast&) {
261 return ndn::util::FaceUri(token);
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...