blob: 7282eff6e6b83cead614ddb5fa4b63c968d3a5fd [file] [log] [blame]
<h1>message_properties.cpp</h1>
<div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;proton/message.hpp&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;proton/types.hpp&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;map&gt;</span><span class="cp"></span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">)</span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="n">proton</span><span class="o">::</span><span class="n">message</span> <span class="n">m</span><span class="p">;</span>
<span class="c1">// Setting properties: legal types are converted automatically to their</span>
<span class="c1">// AMQP counterpart.</span>
<span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">put</span><span class="p">(</span><span class="s">&quot;short&quot;</span><span class="p">,</span> <span class="kt">int16_t</span><span class="p">(</span><span class="mi">123</span><span class="p">));</span>
<span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">put</span><span class="p">(</span><span class="s">&quot;string&quot;</span><span class="p">,</span> <span class="s">&quot;foo&quot;</span><span class="p">);</span>
<span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">put</span><span class="p">(</span><span class="s">&quot;symbol&quot;</span><span class="p">,</span> <span class="n">proton</span><span class="o">::</span><span class="n">symbol</span><span class="p">(</span><span class="s">&quot;sym&quot;</span><span class="p">));</span>
<span class="c1">// Examining properties using proton::get()</span>
<span class="c1">// 1 argument get&lt;&gt;() template specifies expected type of property.</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="o">=</span> <span class="n">proton</span><span class="o">::</span><span class="n">get</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;string&quot;</span><span class="p">));</span>
<span class="c1">// 2 argument get, property must have matching type to output argument.</span>
<span class="kt">int16_t</span> <span class="n">i</span><span class="p">;</span>
<span class="n">proton</span><span class="o">::</span><span class="n">get</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;short&quot;</span><span class="p">),</span> <span class="n">i</span><span class="p">);</span>
<span class="c1">// Checking property types</span>
<span class="n">proton</span><span class="o">::</span><span class="n">type_id</span> <span class="n">type</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;symbol&quot;</span><span class="p">).</span><span class="n">type</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">type</span> <span class="o">!=</span> <span class="n">proton</span><span class="o">::</span><span class="n">SYMBOL</span><span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">logic_error</span><span class="p">(</span><span class="s">&quot;wrong type!&quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// proton::scalar has its own ostream &lt;&lt;</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;using put/get:&quot;</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; short=&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">i</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; string=&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">s</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; symbol=&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;symbol&quot;</span><span class="p">)</span>
<span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="c1">// Converting properties to a convertible type</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;using coerce:&quot;</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; short(as long)=&quot;</span>
<span class="o">&lt;&lt;</span> <span class="n">proton</span><span class="o">::</span><span class="n">coerce</span><span class="o">&lt;</span><span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;short&quot;</span><span class="p">))</span>
<span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="c1">// Extract the properties as a std::map for more complex map operations.</span>
<span class="c1">// You can use other map and sequence types to hold a map, see @ref types_page</span>
<span class="k">typedef</span> <span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="n">proton</span><span class="o">::</span><span class="n">scalar</span><span class="o">&gt;</span> <span class="n">property_map</span><span class="p">;</span>
<span class="n">property_map</span> <span class="n">props</span><span class="p">;</span>
<span class="n">proton</span><span class="o">::</span><span class="n">get</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">(),</span> <span class="n">props</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="n">property_map</span><span class="o">::</span><span class="n">iterator</span> <span class="n">i</span> <span class="o">=</span> <span class="n">props</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">props</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;props[&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">i</span><span class="o">-&gt;</span><span class="n">first</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;]=&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">i</span><span class="o">-&gt;</span><span class="n">second</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">props</span><span class="p">[</span><span class="s">&quot;string&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;bar&quot;</span><span class="p">;</span>
<span class="n">props</span><span class="p">[</span><span class="s">&quot;short&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
<span class="c1">// Update the properties in the message from the modified props map</span>
<span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">()</span> <span class="o">=</span> <span class="n">props</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;short=&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;short&quot;</span><span class="p">)</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; string=&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;string&quot;</span><span class="p">)</span>
<span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="c1">// proton::get throws an exception if types do not match exactly.</span>
<span class="k">try</span> <span class="p">{</span>
<span class="n">proton</span><span class="o">::</span><span class="n">get</span><span class="o">&lt;</span><span class="kt">uint32_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;short&quot;</span><span class="p">));</span> <span class="c1">// bad: uint32_t != int16_t</span>
<span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">logic_error</span><span class="p">(</span><span class="s">&quot;expected exception&quot;</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">proton</span><span class="o">::</span><span class="n">conversion_error</span><span class="o">&amp;</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;expected conversion_error: </span><span class="se">\&quot;</span><span class="s">&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">&#39;&quot;&#39;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// proton::coerce throws an exception if types are not convertible.</span>
<span class="k">try</span> <span class="p">{</span>
<span class="n">proton</span><span class="o">::</span><span class="n">get</span><span class="o">&lt;</span><span class="kt">uint32_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="n">properties</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;string&quot;</span><span class="p">));</span> <span class="c1">// bad: string to uint32_t</span>
<span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">logic_error</span><span class="p">(</span><span class="s">&quot;expected exception&quot;</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">proton</span><span class="o">::</span><span class="n">conversion_error</span><span class="o">&amp;</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;expected conversion_error: </span><span class="se">\&quot;</span><span class="s">&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">&#39;&quot;&#39;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">exception</span><span class="o">&amp;</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;unexpected exception: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p><a href="message_properties.cpp">Download this file</a></p>