Commit d43a11d11b124832da605221de3d4ad20da48d0c

Authored by Hayk Martirosyan
2 parents c0a7e596 3ea755c0

Merge pull request #33 from whoshuu/patch-1

Add syntax highlighting to README.md examples
Showing 1 changed file with 81 additions and 65 deletions
README.md
@@ -49,23 +49,25 @@ This section introduces the main features of redox. Look in `examples/` for more @@ -49,23 +49,25 @@ This section introduces the main features of redox. Look in `examples/` for more
49 #### Hello world 49 #### Hello world
50 Here is the simplest possible redox program: 50 Here is the simplest possible redox program:
51 51
52 - #include <iostream>  
53 - #include <redox.hpp> 52 +```c++
  53 +#include <iostream>
  54 +#include <redox.hpp>
54 55
55 - using namespace std;  
56 - using namespace redox; 56 +using namespace std;
  57 +using namespace redox;
57 58
58 - int main(int argc, char* argv[]) { 59 +int main(int argc, char* argv[]) {
59 60
60 - Redox rdx;  
61 - if(!rdx.connect("localhost", 6379)) return 1; 61 + Redox rdx;
  62 + if(!rdx.connect("localhost", 6379)) return 1;
62 63
63 - rdx.set("hello", "world!");  
64 - cout << "Hello, " << rdx.get("hello") << endl; 64 + rdx.set("hello", "world!");
  65 + cout << "Hello, " << rdx.get("hello") << endl;
65 66
66 - rdx.disconnect();  
67 - return 0;  
68 - } 67 + rdx.disconnect();
  68 + return 0;
  69 +}
  70 +```
69 71
70 Compile and run: 72 Compile and run:
71 73
@@ -83,13 +85,15 @@ any Redis command and providing a reply callback. The `command` method accepts a @@ -83,13 +85,15 @@ any Redis command and providing a reply callback. The `command` method accepts a
83 Redis command in the form of an STL vector of strings, and a callback to be invoked 85 Redis command in the form of an STL vector of strings, and a callback to be invoked
84 when a reply is received or if there is an error. 86 when a reply is received or if there is an error.
85 87
86 - rdx.command<string>({"GET", "hello"}, [](Command<string>& c) {  
87 - if(c.ok()) {  
88 - cout << "Hello, async " << c.reply() << endl;  
89 - } else {  
90 - cerr << "Command has error code " << c.status() << endl;  
91 - }  
92 - }); 88 +```c++
  89 +rdx.command<string>({"GET", "hello"}, [](Command<string>& c) {
  90 + if(c.ok()) {
  91 + cout << "Hello, async " << c.reply() << endl;
  92 + } else {
  93 + cerr << "Command has error code " << c.status() << endl;
  94 + }
  95 +});
  96 +```
93 97
94 This statement tells redox to run the command `GET hello`. The `<string>` template 98 This statement tells redox to run the command `GET hello`. The `<string>` template
95 parameter means that we want the reply to be put into a string and that we expect 99 parameter means that we want the reply to be put into a string and that we expect
@@ -109,43 +113,47 @@ the callback returns. @@ -109,43 +113,47 @@ the callback returns.
109 113
110 Here is a simple example of running `GET hello` asynchronously ten times: 114 Here is a simple example of running `GET hello` asynchronously ten times:
111 115
112 - Redox rdx; 116 +```c++
  117 +Redox rdx;
113 118
114 - // Block until connected, localhost by default  
115 - if(!rdx.connect()) return 1; 119 +// Block until connected, localhost by default
  120 +if(!rdx.connect()) return 1;
116 121
117 - auto got_reply = [](Command<string>& c) {  
118 - if(!c.ok()) return;  
119 - cout << c.cmd() << ": " << c.reply() << endl;  
120 - }; 122 +auto got_reply = [](Command<string>& c) {
  123 + if(!c.ok()) return;
  124 + cout << c.cmd() << ": " << c.reply() << endl;
  125 +};
121 126
122 - for(int i = 0; i < 10; i++) rdx.command<string>({"GET", "hello"}, got_reply); 127 +for(int i = 0; i < 10; i++) rdx.command<string>({"GET", "hello"}, got_reply);
123 128
124 - // Do useful work  
125 - this_thread::sleep_for(chrono::milliseconds(10)); 129 +// Do useful work
  130 +this_thread::sleep_for(chrono::milliseconds(10));
126 131
127 - rdx.disconnect(); // Block until disconnected 132 +rdx.disconnect(); // Block until disconnected
  133 +```
128 134
129 The `.command()` method returns immediately, so this program doesn't wait for a reply 135 The `.command()` method returns immediately, so this program doesn't wait for a reply
130 from the server - it just pauses for ten milliseconds and then shuts down. If we want to 136 from the server - it just pauses for ten milliseconds and then shuts down. If we want to
131 shut down after we get all replies, we could do something like this: 137 shut down after we get all replies, we could do something like this:
132 138
133 - Redox rdx;  
134 - if(!rdx.connect()) return 1; 139 +```c++
  140 +Redox rdx;
  141 +if(!rdx.connect()) return 1;
135 142
136 - int total = 10; // Number of commands to run  
137 - atomic_int count(0); // Number of replies expected  
138 - auto got_reply = [&](Command<string>& c) {  
139 - count++;  
140 - if(c.ok()) cout << c.cmd() << " #" << count << ": " << c.reply() << endl;  
141 - if(count == total) rdx.stop(); // Signal to shut down  
142 - }; 143 +int total = 10; // Number of commands to run
  144 +atomic_int count(0); // Number of replies expected
  145 +auto got_reply = [&](Command<string>& c) {
  146 + count++;
  147 + if(c.ok()) cout << c.cmd() << " #" << count << ": " << c.reply() << endl;
  148 + if(count == total) rdx.stop(); // Signal to shut down
  149 +};
143 150
144 - for(int i = 0; i < total; i++) rdx.command<string>({"GET", "hello"}, got_reply); 151 +for(int i = 0; i < total; i++) rdx.command<string>({"GET", "hello"}, got_reply);
145 152
146 - // Do useful work 153 +// Do useful work
147 154
148 - rdx.wait(); // Block until shut down complete 155 +rdx.wait(); // Block until shut down complete
  156 +```
149 157
150 This example tracks of how how many replies are received and signals the Redox 158 This example tracks of how how many replies are received and signals the Redox
151 instance to stop once they all process. We use an `std::atomic_int` to be safe 159 instance to stop once they all process. We use an `std::atomic_int` to be safe
@@ -162,9 +170,11 @@ between synchronous commands in different threads. The `commandSync` method prov @@ -162,9 +170,11 @@ between synchronous commands in different threads. The `commandSync` method prov
162 a similar API to `command`, but instead of a callback returns a Command object when 170 a similar API to `command`, but instead of a callback returns a Command object when
163 a reply is received. 171 a reply is received.
164 172
165 - Command<string>& c = rdx.commandSync<string>({"GET", "hello"});  
166 - if(c.ok()) cout << c.cmd() << ": " << c.reply() << endl;  
167 - c.free(); 173 +```c++
  174 +Command<string>& c = rdx.commandSync<string>({"GET", "hello"});
  175 +if(c.ok()) cout << c.cmd() << ": " << c.reply() << endl;
  176 +c.free();
  177 +```
168 178
169 When using synchronous commands, the user is responsible for freeing the memory of 179 When using synchronous commands, the user is responsible for freeing the memory of
170 the Command object by calling `c.free()`. The `c.cmd()` method just returns a string 180 the Command object by calling `c.free()`. The `c.cmd()` method just returns a string
@@ -178,22 +188,26 @@ commands in a loop, because it only creates a single Command object. @@ -178,22 +188,26 @@ commands in a loop, because it only creates a single Command object.
178 to repeat the command. It then runs the command on the given interval until the user 188 to repeat the command. It then runs the command on the given interval until the user
179 calls `c.free()`. 189 calls `c.free()`.
180 190
181 - Command<string>& cmd = rdx.commandLoop<string>({"GET", "hello"}, [](Command<string>& c) {  
182 - if(c.ok()) cout << c.cmd() << ": " << c.reply() << endl;  
183 - }, 0.1); 191 +```c++
  192 +Command<string>& cmd = rdx.commandLoop<string>({"GET", "hello"}, [](Command<string>& c) {
  193 + if(c.ok()) cout << c.cmd() << ": " << c.reply() << endl;
  194 +}, 0.1);
184 195
185 - this_thread::sleep_for(chrono::seconds(1));  
186 - cmd.free();  
187 - rdx.disconnect(); 196 +this_thread::sleep_for(chrono::seconds(1));
  197 +cmd.free();
  198 +rdx.disconnect();
  199 +```
188 200
189 Finally, `commandDelayed` runs a command after a specified delay (in seconds). It does 201 Finally, `commandDelayed` runs a command after a specified delay (in seconds). It does
190 not return a command object, because the memory is automatically freed after the callback 202 not return a command object, because the memory is automatically freed after the callback
191 is invoked. 203 is invoked.
192 204
193 - rdx.commandDelayed<string>({"GET", "hello"}, [](Command<string>& c) {  
194 - if(c.ok()) cout << c.cmd() << ": " << c.reply() << endl;  
195 - }, 1);  
196 - this_thread::sleep_for(chrono::seconds(2)); 205 +```c++
  206 +rdx.commandDelayed<string>({"GET", "hello"}, [](Command<string>& c) {
  207 + if(c.ok()) cout << c.cmd() << ": " << c.reply() << endl;
  208 +}, 1);
  209 +this_thread::sleep_for(chrono::seconds(2));
  210 +```
197 211
198 #### Convenience methods 212 #### Convenience methods
199 The four methods `command`, `commandSync`, `commandLoop`, and `commandDelayed` form 213 The four methods `command`, `commandSync`, `commandLoop`, and `commandDelayed` form
@@ -210,19 +224,21 @@ Redox provides an API for the pub/sub functionality of Redis. Publishing is done @@ -210,19 +224,21 @@ Redox provides an API for the pub/sub functionality of Redis. Publishing is done
210 any other command using a Redox instance. There is a separate Subscriber class that 224 any other command using a Redox instance. There is a separate Subscriber class that
211 receives messages and provides subscribe/unsubscribe and psubscribe/punsubscribe methods. 225 receives messages and provides subscribe/unsubscribe and psubscribe/punsubscribe methods.
212 226
213 - Redox rdx; Subscriber sub;  
214 - if(!rdx.connect() || !sub.connect()) return 1; 227 +```c++
  228 +Redox rdx; Subscriber sub;
  229 +if(!rdx.connect() || !sub.connect()) return 1;
215 230
216 - sub.subscribe("hello", [](const string& topic, const string& msg) {  
217 - cout << topic << ": " << msg << endl;  
218 - }); 231 +sub.subscribe("hello", [](const string& topic, const string& msg) {
  232 + cout << topic << ": " << msg << endl;
  233 +});
219 234
220 - for(int i = 0; i < 10; i++) {  
221 - rdx.publish("hello", "this is a pubsub message");  
222 - this_thread::sleep_for(chrono::milliseconds(500));  
223 - } 235 +for(int i = 0; i < 10; i++) {
  236 + rdx.publish("hello", "this is a pubsub message");
  237 + this_thread::sleep_for(chrono::milliseconds(500));
  238 +}
224 239
225 - sub.disconnect(); rdx.disconnect(); 240 +sub.disconnect(); rdx.disconnect();
  241 +```
226 242
227 #### strToVec and vecToStr 243 #### strToVec and vecToStr
228 Redox provides helper methods to convert between a string command and 244 Redox provides helper methods to convert between a string command and