Arduino-Redis
A Redis library for Arduino.
RedisInternal.h
Go to the documentation of this file.
1 #ifndef REDIS_INTERNAL_H
2 #define REDIS_INTERNAL_H
3 
4 #include "Arduino.h"
5 #include "Client.h"
6 #include <vector>
7 #include <memory>
8 #include <functional>
9 
10 #define CRLF F("\r\n")
11 
12 typedef std::vector<String> ArgList;
13 
18 /* The lack of RTTI on Ardunio is unfortunate but completely understandable.
19  * However, we're not going to let that stop us, so RedisObject implements a basic
20  * but functional type system for Redis objects.
21  */
23 {
24 public:
26  typedef enum
27  {
28  NoType = '\0',
29  SimpleString = '+',
30  Error = '-',
31  Integer = ':',
32  BulkString = '$',
33  Array = '*',
35  } Type;
36 
38  RedisObject(Type tc) : _type(tc) {}
39  RedisObject(Type tc, Client &c) : _type(tc) { init(c); }
40 
41  virtual ~RedisObject() {}
42 
43  static std::shared_ptr<RedisObject> parseTypeNonBlocking(Client &);
44  static std::shared_ptr<RedisObject> parseType(Client &);
45 
51  virtual void init(Client &client);
52 
54  virtual String RESP() = 0;
55 
58  virtual operator String() { if(data) return data; return String("(nil)");}
59 
60  Type type() const { return _type; }
61 
62 protected:
63  String data;
64  Type _type = Type::NoType;
65 };
66 
69 {
70 public:
72  ~RedisSimpleString() override {}
73 
74  virtual String RESP() override;
75 };
76 
79 {
80 public:
81  RedisBulkString(Client &c) : RedisObject(Type::BulkString, c) { init(c); }
83  ~RedisBulkString() override {}
84 
85  virtual void init(Client &client) override;
86 
87  virtual String RESP() override;
88 };
89 
91 class RedisArray : public RedisObject
92 {
93 public:
95  RedisArray(Client &c) : RedisObject(Type::Array, c) { init(c); }
96  ~RedisArray() override { vec.empty(); }
97 
98  void add(std::shared_ptr<RedisObject> param) { vec.push_back(param); }
99 
100  operator std::vector<String>() const;
101 
102  virtual void init(Client &client) override;
103 
104  virtual String RESP() override;
105 
106 protected:
107  std::vector<std::shared_ptr<RedisObject>> vec;
108 };
109 
112 {
113 public:
114  RedisInteger(Client &c) : RedisSimpleString(c) { _type = Type::Integer; }
115  ~RedisInteger() override {}
116 
117  operator int() { return data.toInt(); }
118  operator bool() { return (bool)operator int(); }
119 };
120 
123 {
124 public:
125  RedisError(Client &c) : RedisSimpleString(c) { _type = Type::Error; }
126  ~RedisError() override {}
127 };
128 
131 {
132 public:
133  typedef enum
134  {
135  UnknownError = -254,
140 
143  ~RedisInternalError() override {}
144 
146  void setErrorString(String es) { data = es; }
147 
148  virtual String RESP() override { return "-INTERNAL ERROR " + String(_code) + (data ? ": " + data : ""); }
149 
150 protected:
152 };
153 
155 class RedisCommand : public RedisArray
156 {
157 public:
158  RedisCommand(String command) : RedisArray()
159  {
160  add(std::shared_ptr<RedisObject>(new RedisBulkString(command)));
161  }
162 
163  RedisCommand(String command, ArgList args)
164  : RedisCommand(command)
165  {
166  for (auto arg : args)
167  {
168  add(std::shared_ptr<RedisObject>(new RedisBulkString(arg)));
169  }
170  }
171 
172  ~RedisCommand() override {}
173 
179  std::shared_ptr<RedisObject> issue(Client &cmdClient);
180 
181  template <typename T>
182  T issue_typed(Client &cmdClient);
183 
184 private:
185  String _err;
186 };
187 
188 #endif // REDIS_INTERNAL_H
RedisObject::init
virtual void init(Client &client)
Definition: RedisInternal.cpp:6
RedisCommand::RedisCommand
RedisCommand(String command, ArgList args)
Definition: RedisInternal.h:163
RedisCommand::issue
std::shared_ptr< RedisObject > issue(Client &cmdClient)
Definition: RedisInternal.cpp:108
RedisBulkString::init
virtual void init(Client &client) override
Definition: RedisInternal.cpp:23
RedisError
Definition: RedisInternal.h:122
RedisObject::BulkString
@ BulkString
Definition: RedisInternal.h:32
RedisArray::add
void add(std::shared_ptr< RedisObject > param)
Definition: RedisInternal.h:98
RedisSimpleString::RESP
virtual String RESP() override
Definition: RedisInternal.cpp:12
RedisObject::RedisObject
RedisObject(Type tc)
Definition: RedisInternal.h:38
RedisArray::~RedisArray
~RedisArray() override
Definition: RedisInternal.h:96
RedisArray::vec
std::vector< std::shared_ptr< RedisObject > > vec
Definition: RedisInternal.h:107
RedisArray::RESP
virtual String RESP() override
Definition: RedisInternal.cpp:96
RedisCommand::~RedisCommand
~RedisCommand() override
Definition: RedisInternal.h:172
RedisCommand
Definition: RedisInternal.h:155
RedisBulkString::~RedisBulkString
~RedisBulkString() override
Definition: RedisInternal.h:83
RedisObject::_type
Type _type
Definition: RedisInternal.h:64
RedisSimpleString
Definition: RedisInternal.h:68
RedisInternalError::RedisInternalErrorCode
RedisInternalErrorCode
Definition: RedisInternal.h:133
RedisObject::RedisObject
RedisObject()
Definition: RedisInternal.h:37
RedisObject
Definition: RedisInternal.h:22
RedisObject::SimpleString
@ SimpleString
Definition: RedisInternal.h:29
RedisInternalError::_code
RedisInternalErrorCode _code
Definition: RedisInternal.h:151
RedisObject::Type
Type
Definition: RedisInternal.h:26
RedisObject::parseTypeNonBlocking
static std::shared_ptr< RedisObject > parseTypeNonBlocking(Client &)
Definition: RedisInternal.cpp:161
RedisInternalError::NoError
@ NoError
Definition: RedisInternal.h:138
RedisInternalError::RedisInternalError
RedisInternalError(RedisInternalErrorCode c, String es)
Definition: RedisInternal.h:142
RedisInteger::RedisInteger
RedisInteger(Client &c)
Definition: RedisInternal.h:114
RedisError::RedisError
RedisError(Client &c)
Definition: RedisInternal.h:125
RedisInternalError::Disconnected
@ Disconnected
Definition: RedisInternal.h:137
RedisInteger
Definition: RedisInternal.h:111
RedisArray::init
virtual void init(Client &client) override
Definition: RedisInternal.cpp:58
RedisObject::Array
@ Array
Definition: RedisInternal.h:33
RedisCommand::RedisCommand
RedisCommand(String command)
Definition: RedisInternal.h:158
RedisBulkString
Definition: RedisInternal.h:78
RedisObject::Error
@ Error
Definition: RedisInternal.h:30
RedisObject::type
Type type() const
Definition: RedisInternal.h:60
RedisInternalError::~RedisInternalError
~RedisInternalError() override
Definition: RedisInternal.h:143
RedisObject::Integer
@ Integer
Definition: RedisInternal.h:31
RedisObject::NoType
@ NoType
Definition: RedisInternal.h:28
RedisArray
Definition: RedisInternal.h:91
RedisInternalError
Definition: RedisInternal.h:130
RedisError::~RedisError
~RedisError() override
Definition: RedisInternal.h:126
RedisArray::RedisArray
RedisArray()
Definition: RedisInternal.h:94
RedisBulkString::RedisBulkString
RedisBulkString(Client &c)
Definition: RedisInternal.h:81
RedisObject::parseType
static std::shared_ptr< RedisObject > parseType(Client &)
Definition: RedisInternal.cpp:194
RedisArray::RedisArray
RedisArray(Client &c)
Definition: RedisInternal.h:95
RedisObject::InternalError
@ InternalError
Definition: RedisInternal.h:34
RedisCommand::issue_typed
T issue_typed(Client &cmdClient)
RedisInternalError::code
RedisInternalErrorCode code()
Definition: RedisInternal.h:145
ArgList
std::vector< String > ArgList
Definition: RedisInternal.h:12
RedisInternalError::setErrorString
void setErrorString(String es)
Definition: RedisInternal.h:146
RedisInternalError::RedisInternalError
RedisInternalError(RedisInternalErrorCode c)
Definition: RedisInternal.h:141
RedisInteger::~RedisInteger
~RedisInteger() override
Definition: RedisInternal.h:115
RedisInternalError::UnknownError
@ UnknownError
Definition: RedisInternal.h:135
RedisObject::~RedisObject
virtual ~RedisObject()
Definition: RedisInternal.h:41
RedisBulkString::RESP
virtual String RESP() override
Definition: RedisInternal.cpp:48
RedisSimpleString::~RedisSimpleString
~RedisSimpleString() override
Definition: RedisInternal.h:72
RedisObject::RESP
virtual String RESP()=0
RedisInternalError::RESP
virtual String RESP() override
Definition: RedisInternal.h:148
RedisSimpleString::RedisSimpleString
RedisSimpleString(Client &c)
Definition: RedisInternal.h:71
RedisObject::RedisObject
RedisObject(Type tc, Client &c)
Definition: RedisInternal.h:39
RedisObject::data
String data
Definition: RedisInternal.h:63
RedisBulkString::RedisBulkString
RedisBulkString(String &s)
Definition: RedisInternal.h:82
RedisInternalError::UnknownType
@ UnknownType
Definition: RedisInternal.h:136