command/Request: add parser methods

Wrapper for protocol/ArgParser.cxx.
This commit is contained in:
Max Kellermann
2015-08-11 22:18:40 +02:00
parent e118e958f7
commit b1480167be
9 changed files with 96 additions and 67 deletions

View File

@@ -21,14 +21,54 @@
#define MPD_REQUEST_HXX
#include "check.h"
#include "protocol/ArgParser.hxx"
#include "util/ConstBuffer.hxx"
#include <utility>
#include <assert.h>
class Client;
class Request : public ConstBuffer<const char *> {
typedef ConstBuffer<const char *> Base;
public:
constexpr Request(const char *const*argv, size_type n)
:Base(argv, n) {}
constexpr const char *GetOptional(unsigned idx,
const char *default_value=nullptr) const {
return idx < size
? data[idx]
: default_value;
}
template<typename T, typename... Args>
bool Parse(unsigned idx, T &value_r, Client &client,
Args&&... args) {
assert(idx < size);
return ParseCommandArg(client, value_r, data[idx],
std::forward<Args>(args)...);
}
template<typename T, typename... Args>
bool ParseOptional(unsigned idx, T &value_r, Client &client,
Args&&... args) {
return idx >= size ||
Parse(idx, value_r, client,
std::forward<Args>(args)...);
}
template<typename T, typename... Args>
bool ParseShift(unsigned idx, T &value_r, Client &client,
Args&&... args) {
bool success = Parse(idx, value_r, client,
std::forward<Args>(args)...);
shift();
return success;
}
};
#endif