<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<link href="https://rust.code-maven.com/atom" rel="self" />
<title>Rust programming language</title>
<id>https://rust.code-maven.com</id>
<updated>2026-06-23T21:30:01</updated>

  <entry>
    <title>Mutation testing the xmlem Rust crate</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-06-23T21:30:01Z</updated>
    <pubDate>2026-06-23T21:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/mutant-testing-xmlem" />
    <id>https://rust.code-maven.com/mutant-testing-xmlem</id>
    <content type="html"><![CDATA[<p>As I am working on a project that generates HTML pages I wanted to prettify / beautify the files.
So far the best crate I found is the <a href="https://crates.io/crates/xmlem">xmlem</a>, however the generated
file are &quot;too pretty&quot;. That is, every HTML element is on it own line. I wanted to have an option
to keep the result a bit tighter. So I opened an <a href="https://github.com/xmlem/xmlem/issues/14">issue</a>
and <a href="https://github.com/Ltrlg">Ltrlg</a> basically gave his (her?) blessing for someone to work on it.</p>
<p>I thought to give it a try, but first I had to make myself familiar with the code and with the tests.</p>
<p>Side note: by the time I started to write this blog post <a href="https://github.com/bbqsrc">Brendan Molloy</a>,
who is apparently the original author of the crate, has already committed the change.
So maybe I won't have to do anything here. On the other hand I could contribute some of my expertise
to the project (GitHub Actions, testing etc.)</p>
<p>As I looked at the tests I noticed that in many cases the tests seem to only print the generated
HTML/XML and don't seem to verify the result. There were several <code>println!</code> calls instead of <code>assert_eq!</code> calls.</p>
<p>I figured it would be an interesting thing to see the test coverage report and the mutation testing report.</p>
<h2 class="title is-4">SHA</h2>
<p>I cloned the repository and got this sha: <code>89b9f9fa2f729f6e95ec79638c977dfecc3b6ec1</code>.
I keep it here so you can check it out too to reproduce this result.</p>
<h2 class="title is-4">Test coverage report</h2>
<p>Using <a href="https://crates.io/crates/cargo-tarpaulin">cargo-tarpaulin</a></p>
<pre><code>cargo install cargo-tarpaulin
</code></pre>
<pre><code>$ cargo tarpaulin --out Html --out Stdout

|| Uncovered Lines:
|| src/display.rs: 45-47, 50-52, 55-57, 60-62, 65-67, 135, 139, 293-294, 298, 342-343, 347, 392, 492-495, 497, 537
|| src/document.rs: 25, 49, 51-52, 57, 59-60, 73-74, 77-79, 82-84, 88-92, 99-107, 112-114, 118-125, 129, 175-177, 180, 182-190, 192-193, 197-198, 200-202, 204, 208-209, 214, 217-218, 220-224, 226, 228-229, 231, 234-237, 239, 242-244, 248-253, 257-258, 261-262, 265-269, 272-275, 281, 284-286, 294-297, 301, 318-321, 325-327, 357, 364, 369, 384, 422, 425, 431-433, 450-451, 466-468, 480, 487-489, 512, 527-529, 535-540, 542-544, 556, 563-564, 566-567, 569-570, 572, 574, 576-577, 601, 625-631, 633-634, 636-638, 645-650
|| src/element.rs: 93, 96, 119, 163, 168, 170, 206, 211, 220, 279-282, 284-287, 289, 440, 486, 549-550, 554-555, 558-560, 564-565, 568, 575-576, 578-579, 581, 583, 585-586, 589, 592-593, 595-596, 598, 601-602, 604, 606-607, 610, 617-619, 633
|| src/key.rs: 23-25, 33-35, 43-45, 68, 74-77, 88-91, 95-98, 102-105, 109-112, 116-123
|| src/select.rs: 48, 54-55, 69, 73, 78-79, 104, 108, 139-140, 143-144, 150, 154-155, 158, 162-165, 171-174, 180, 188-189, 192-193, 205, 209-210, 217, 221, 229, 237, 241, 245, 250-252, 256, 261-262, 264-265, 269, 273, 276, 280-281, 284-285, 288-290, 293, 295, 299, 301, 305, 316, 322-323, 346, 355-360, 364-366
|| src/value.rs: 27, 34, 41, 48, 52-55
|| Tested/Total Lines:
|| src/display.rs: 182/212
|| src/document.rs: 145/325
|| src/element.rs: 134/188
|| src/key.rs: 14/52
|| src/select.rs: 37/112
|| src/value.rs: 12/20
||
57.65% coverage, 524/909 lines covered
</code></pre>
<h2 class="title is-4">Mutation testing</h2>
<p>Using <a href="https://crates.io/crates/cargo-mutants">cargo-mutants</a></p>
<p>For documentation see the <a href="https://mutants.rs/">mutants</a> web site.</p>
<pre><code>cargo install cargo-mutants
</code></pre>
<pre><code>$ cargo mutants
Found 337 mutants to test
ok       Unmutated baseline in 8s build + 0s test
 INFO Auto-set test timeout to 20s
MISSED   src/display.rs:46:9: replace Config::indent -&gt; Self with Default::default() in 0s build + 0s test
MISSED   src/display.rs:51:9: replace Config::end_pad -&gt; Self with Default::default() in 0s build + 0s test
MISSED   src/display.rs:56:9: replace Config::max_line_length -&gt; Self with Default::default() in 0s build + 0s test
MISSED   src/display.rs:61:9: replace Config::entity_mode -&gt; Self with Default::default() in 0s build + 0s test
MISSED   src/display.rs:66:9: replace Config::indent_text_nodes -&gt; Self with Default::default() in 0s build + 0s test
MISSED   src/display.rs:128:9: replace &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for Declaration&gt;::print -&gt; std::io::Result&lt;()&gt; with Ok(()) in 0s build + 0s test
MISSED   src/display.rs:222:9: replace + with * in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:221:9: replace + with * in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:223:53: replace + with * in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:223:43: replace + with * in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:223:17: replace + with * in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:226:56: replace &gt; with == in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:226:56: replace &gt; with &lt; in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:226:56: replace &gt; with &gt;= in fmt_attrs in 0s build + 0s test
MISSED   src/display.rs:288:25: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:287:25: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 1s test
MISSED   src/display.rs:289:69: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 1s test
MISSED   src/display.rs:289:59: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:289:33: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:291:72: replace &gt; with == in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:291:72: replace &gt; with &lt; in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:291:72: replace &gt; with &gt;= in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:333:28: replace match guard !attrs.is_empty() with false in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:337:21: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:336:21: replace + with - in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:336:21: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:338:65: replace + with - in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 1s test
MISSED   src/display.rs:338:65: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 1s test
MISSED   src/display.rs:338:55: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:338:29: replace + with * in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:340:53: replace &amp;&amp; with || in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 1s test
MISSED   src/display.rs:340:68: replace &gt; with == in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:340:68: replace &gt; with &lt; in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:340:68: replace &gt; with &gt;= in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 1s test
MISSED   src/display.rs:354:60: replace &amp;&amp; with || in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:354:46: replace || with &amp;&amp; in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:354:49: delete ! in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:360:49: delete ! in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:379:38: replace || with &amp;&amp; in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:379:41: delete ! in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for ElementValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:412:41: replace &amp;&amp; with || in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for NodeValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:436:41: replace &amp;&amp; with || in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for NodeValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:442:41: replace &amp;&amp; with || in &lt;impl Print&lt;Config, State&lt;'_&gt;&gt; for NodeValue&gt;::print in 0s build + 0s test
MISSED   src/display.rs:482:53: replace || with &amp;&amp; in process_entities in 0s build + 0s test
MISSED   src/display.rs:486:28: replace || with &amp;&amp; in process_entities in 0s build + 0s test
MISSED   src/display.rs:492:49: replace match guard !is_text with true in process_entities in 0s build + 0s test
MISSED   src/display.rs:492:49: replace match guard !is_text with false in process_entities in 0s build + 0s test
MISSED   src/display.rs:493:48: replace match guard !is_text with true in process_entities in 0s build + 3s test
MISSED   src/display.rs:493:48: replace match guard !is_text with false in process_entities in 0s build + 0s test
MISSED   src/display.rs:500:28: replace match guard !ch.is_ascii_whitespace() &amp;&amp; ch.is_ascii_control() with false in process_entities in 0s build + 0s test
MISSED   src/display.rs:492:49: delete ! in process_entities in 0s build + 0s test
MISSED   src/display.rs:493:48: delete ! in process_entities in 0s build + 0s test
MISSED   src/display.rs:508:25: replace &amp;&amp; with || in process_entities in 0s build + 0s test
MISSED   src/display.rs:508:32: replace == with != in process_entities in 0s build + 0s test
MISSED   src/display.rs:510:33: replace &amp;&amp; with || in process_entities in 0s build + 0s test
MISSED   src/display.rs:511:61: replace || with &amp;&amp; in process_entities in 0s build + 0s test
MISSED   src/document.rs:83:8: delete ! in ord_elem in 0s build + 0s test
MISSED   src/document.rs:91:16: delete ! in ord_elem in 0s build + 0s test
MISSED   src/document.rs:106:12: delete ! in ord_elem in 0s build + 0s test
MISSED   src/document.rs:124:12: delete ! in ord_elem in 0s build + 0s test
MISSED   src/document.rs:176:9: replace Document::sort_nodes -&gt; Vec&lt;Node&gt; with vec![] in 0s build + 1s test
MISSED   src/document.rs:176:29: replace &lt; with == in Document::sort_nodes in 0s build + 0s test
MISSED   src/document.rs:176:29: replace &lt; with &gt; in Document::sort_nodes in 0s build + 0s test
MISSED   src/document.rs:176:29: replace &lt; with &lt;= in Document::sort_nodes in 0s build + 0s test
MISSED   src/document.rs:208:21: replace &amp;&amp; with || in Document::sort_nodes in 0s build + 0s test
MISSED   src/document.rs:208:24: delete ! in Document::sort_nodes in 0s build + 0s test
MISSED   src/document.rs:243:9: replace Document::sort_attrs with () in 0s build + 0s test
MISSED   src/document.rs:249:9: replace Document::sort with () in 0s build + 0s test
MISSED   src/document.rs:258:9: replace Document::set_declaration with () in 0s build + 0s test
MISSED   src/document.rs:262:9: replace Document::declaration -&gt; Option&lt;&amp;Declaration&gt; with None in 0s build + 0s test
MISSED   src/document.rs:266:9: replace Document::set_doctype with () in 0s build + 0s test
MISSED   src/document.rs:295:9: replace Document::doctype -&gt; Option&lt;&amp;str&gt; with None in 0s build + 0s test
MISSED   src/document.rs:295:9: replace Document::doctype -&gt; Option&lt;&amp;str&gt; with Some(&quot;&quot;) in 0s build + 0s test
MISSED   src/document.rs:295:9: replace Document::doctype -&gt; Option&lt;&amp;str&gt; with Some(&quot;xyzzy&quot;) in 0s build + 0s test
MISSED   src/document.rs:319:9: replace Document::to_string_pretty_with_config -&gt; String with String::new() in 0s build + 0s test
MISSED   src/document.rs:319:9: replace Document::to_string_pretty_with_config -&gt; String with &quot;xyzzy&quot;.into() in 0s build + 0s test
MISSED   src/document.rs:363:25: delete match arm Some(XML_VERSION_1_0) in Document::from_reader in 0s build + 0s test
MISSED   src/document.rs:366:25: delete match arm Some(XML_VERSION_1_1) in Document::from_reader in 0s build + 0s test
MISSED   src/document.rs:626:9: replace &lt;impl fmt::Display for ReadError&gt;::fmt -&gt; fmt::Result with Ok(Default::default()) in 2s build + 2s test
MISSED   src/document.rs:646:9: replace &lt;impl Error for ReadError&gt;::source -&gt; Option&lt;&amp;(dyn Error +'static)&gt; with None in 0s build + 0s test
MISSED   src/element.rs:214:18: replace &gt;= with &lt; in Element::append_new_element_after in 0s build + 0s test
MISSED   src/element.rs:559:9: replace Element::display -&gt; String with String::new() in 0s build + 0s test
MISSED   src/element.rs:559:9: replace Element::display -&gt; String with &quot;xyzzy&quot;.into() in 0s build + 1s test
MISSED   src/element.rs:576:9: replace Element::next_sibling_element -&gt; Option&lt;Element&gt; with None in 0s build + 1s test
MISSED   src/element.rs:581:29: replace == with != in Element::next_sibling_element in 0s build + 0s test
MISSED   src/element.rs:583:15: replace += with -= in Element::next_sibling_element in 0s build + 0s test
MISSED   src/element.rs:583:15: replace += with *= in Element::next_sibling_element in 0s build + 0s test
MISSED   src/element.rs:585:18: replace &lt; with == in Element::next_sibling_element in 0s build + 0s test
MISSED   src/element.rs:585:18: replace &lt; with &gt; in Element::next_sibling_element in 0s build + 0s test
MISSED   src/element.rs:585:18: replace &lt; with &lt;= in Element::next_sibling_element in 0s build + 0s test
MISSED   src/element.rs:593:9: replace Element::prev_sibling_element -&gt; Option&lt;Element&gt; with None in 0s build + 1s test
MISSED   src/element.rs:598:29: replace == with != in Element::prev_sibling_element in 0s build + 0s test
MISSED   src/element.rs:601:18: replace == with != in Element::prev_sibling_element in 0s build + 0s test
MISSED   src/element.rs:604:15: replace -= with += in Element::prev_sibling_element in 0s build + 0s test
MISSED   src/element.rs:604:15: replace -= with /= in Element::prev_sibling_element in 0s build + 0s test
MISSED   src/element.rs:606:18: replace == with != in Element::prev_sibling_element in 0s build + 0s test
MISSED   src/element.rs:618:9: replace Element::query_selector_all -&gt; Vec&lt;Element&gt; with vec![] in 0s build + 0s test
TIMEOUT  src/element.rs:644:15: replace += with *= in walk_tree in 0s build + 20s test
MISSED   src/key.rs:24:9: replace CDataSection::as_str -&gt; &amp;'d str with &quot;&quot; in 0s build + 0s test
MISSED   src/key.rs:24:9: replace CDataSection::as_str -&gt; &amp;'d str with &quot;xyzzy&quot; in 0s build + 0s test
MISSED   src/key.rs:34:9: replace ProcessingInstruction::as_str -&gt; &amp;'d str with &quot;&quot; in 0s build + 0s test
MISSED   src/key.rs:34:9: replace ProcessingInstruction::as_str -&gt; &amp;'d str with &quot;xyzzy&quot; in 0s build + 0s test
MISSED   src/key.rs:44:9: replace Comment::as_str -&gt; &amp;'d str with &quot;&quot; in 0s build + 0s test
MISSED   src/key.rs:44:9: replace Comment::as_str -&gt; &amp;'d str with &quot;xyzzy&quot; in 0s build + 0s test
MISSED   src/key.rs:75:9: replace Node::as_text -&gt; Option&lt;Text&gt; with None in 0s build + 0s test
MISSED   src/key.rs:76:13: delete match arm Node::Text(e) in Node::as_text in 0s build + 0s test
MISSED   src/key.rs:89:9: replace Node::as_document_type -&gt; Option&lt;DocumentType&gt; with None in 0s build + 0s test
MISSED   src/key.rs:90:13: delete match arm Node::DocumentType(e) in Node::as_document_type in 0s build + 0s test
MISSED   src/key.rs:96:9: replace Node::as_cdata -&gt; Option&lt;CDataSection&gt; with None in 0s build + 0s test
MISSED   src/key.rs:97:13: delete match arm Node::CDataSection(e) in Node::as_cdata in 0s build + 0s test
MISSED   src/key.rs:103:9: replace Node::as_comment -&gt; Option&lt;Comment&gt; with None in 0s build + 0s test
MISSED   src/key.rs:104:13: delete match arm Node::Comment(e) in Node::as_comment in 0s build + 0s test
MISSED   src/key.rs:110:9: replace Node::as_processing_instruction -&gt; Option&lt;ProcessingInstruction&gt; with None in 0s build + 0s test
MISSED   src/key.rs:111:13: delete match arm Node::ProcessingInstruction(e) in Node::as_processing_instruction in 0s build + 0s test
MISSED   src/key.rs:117:9: replace Node::to_ordinal -&gt; u8 with 0 in 0s build + 0s test
MISSED   src/key.rs:117:9: replace Node::to_ordinal -&gt; u8 with 1 in 0s build + 0s test
MISSED   src/select.rs:42:5: replace hash -&gt; u32 with 0 in 0s build + 0s test
MISSED   src/select.rs:42:5: replace hash -&gt; u32 with 1 in 0s build + 0s test
MISSED   src/select.rs:49:9: replace &lt;impl Borrow&lt;String&gt; for PrehashedString&gt;::borrow -&gt; &amp;String with Box::leak(Box::new(String::new())) in 0s build + 0s test
MISSED   src/select.rs:49:9: replace &lt;impl Borrow&lt;String&gt; for PrehashedString&gt;::borrow -&gt; &amp;String with Box::leak(Box::new(&quot;xyzzy&quot;.into())) in 0s build + 0s test
MISSED   src/select.rs:55:9: replace &lt;impl PrecomputedHash for PrehashedString&gt;::precomputed_hash -&gt; u32 with 0 in 0s build + 0s test
MISSED   src/select.rs:55:9: replace &lt;impl PrecomputedHash for PrehashedString&gt;::precomputed_hash -&gt; u32 with 1 in 0s build + 0s test
MISSED   src/select.rs:73:9: replace &lt;impl cssparser::ToCss for Value&gt;::to_css -&gt; std::fmt::Result with Ok(Default::default()) in 0s build + 0s test
MISSED   src/select.rs:79:9: replace &lt;impl PrecomputedHash for Value&gt;::precomputed_hash -&gt; u32 with 0 in 0s build + 0s test
MISSED   src/select.rs:79:9: replace &lt;impl PrecomputedHash for Value&gt;::precomputed_hash -&gt; u32 with 1 in 0s build + 0s test
MISSED   src/select.rs:105:9: replace &lt;impl NonTSPseudoClass for Value&gt;::is_active_or_hover -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:109:9: replace &lt;impl NonTSPseudoClass for Value&gt;::is_user_action_state -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:144:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::parent_element -&gt; Option&lt;Self&gt; with None in 0s build + 0s test
MISSED   src/select.rs:151:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::parent_node_is_shadow_root -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:159:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_pseudo_element -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:163:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::prev_sibling_element -&gt; Option&lt;Self&gt; with None in 0s build + 0s test
MISSED   src/select.rs:172:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::next_sibling_element -&gt; Option&lt;Self&gt; with None in 0s build + 0s test
MISSED   src/select.rs:181:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_html_element_in_html_document -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:185:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_local_name -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:189:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_namespace -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:189:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_namespace -&gt; bool with false in 0s build + 0s test
MISSED   src/select.rs:189:44: replace == with != in &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_namespace in 0s build + 0s test
MISSED   src/select.rs:193:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_same_type -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:193:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_same_type -&gt; bool with false in 0s build + 1s test
MISSED   src/select.rs:193:42: replace == with != in &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_same_type in 0s build + 0s test
MISSED   src/select.rs:202:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::attr_matches -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:206:50: replace match guard ns.as_str() == &quot;&quot; with true in &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::attr_matches in 0s build + 0s test
MISSED   src/select.rs:226:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::match_non_ts_pseudo_class -&gt; bool with true in 0s build + 1s test
MISSED   src/select.rs:234:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::match_pseudo_element -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:238:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_link -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:242:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_html_slot_element -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:250:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_id -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:250:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_id -&gt; bool with false in 0s build + 0s test
MISSED   src/select.rs:261:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_class -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:261:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_class -&gt; bool with false in 0s build + 0s test
MISSED   src/select.rs:273:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::imported_part -&gt; Option&lt;&lt;Self::Impl as SelectorImpl&gt;::Identifier&gt; with Some(Default::default()) in 0s build + 0s test
MISSED   src/select.rs:277:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_part -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:281:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_empty -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:281:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_empty -&gt; bool with false in 0s build + 0s test
MISSED   src/select.rs:285:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_root -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:285:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_root -&gt; bool with false in 0s build + 0s test
MISSED   src/select.rs:285:30: replace == with != in &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::is_root in 0s build + 0s test
MISSED   src/select.rs:289:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::first_element_child -&gt; Option&lt;Self&gt; with None in 0s build + 0s test
MISSED   src/select.rs:302:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::has_custom_state -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:306:9: replace &lt;impl selectors::Element for ElementRef&lt;'_&gt;&gt;::add_element_unique_hashes -&gt; bool with true in 0s build + 0s test
MISSED   src/select.rs:321:9: replace &lt;impl Parser&lt;'i&gt; for TheParser&gt;::parse_non_ts_pseudo_class -&gt; Result&lt;Value, ParseError&lt;'i, SelectorParseErrorKind&lt;'i&gt;&gt;&gt; with Ok(Default::default()) in 0s build + 0s test
MISSED   src/select.rs:353:9: replace Selector::matches -&gt; bool with true in 0s build + 0s test
MISSED   src/value.rs:53:9: replace NodeValue::as_document_type -&gt; Option&lt;&amp;str&gt; with None in 0s build + 0s test
MISSED   src/value.rs:53:9: replace NodeValue::as_document_type -&gt; Option&lt;&amp;str&gt; with Some(&quot;&quot;) in 0s build + 0s test
MISSED   src/value.rs:53:9: replace NodeValue::as_document_type -&gt; Option&lt;&amp;str&gt; with Some(&quot;xyzzy&quot;) in 0s build + 0s test
MISSED   src/value.rs:54:13: delete match arm NodeValue::DocumentType(e) in NodeValue::as_document_type in 0s build + 0s test
337 mutants tested in 6m: 165 missed, 118 caught, 53 unviable, 1 timeouts
</code></pre>
<p>The 165 missed mutants indicate that there are lots of places the code could be changed and the test would not catch the regression.</p>
<h2 class="title is-4">Convert <code>println!</code> to <code>assert_eq!</code></h2>
<p>As I mentioned, there were many test cases where at the end of the test the content of the generated document was printed,
but not verified. So I changed all those cases. I don't know much about this crate so I could not personally verify
the correctness of the results. So first I changed the <code>println</code> to compare the result to an empty string. This made the test
fail printing the actual result. Then I took the current actual result and set it as the expected string.</p>
<p>This will ensure that changes to the code don't lead to unplanned changes in the output.</p>
<p>Later someone who wants to manually verify the correctness of the tests can do so.</p>
<p>Here is an example of the changes I made. See the full <a href="https://github.com/xmlem/xmlem/commit/4b002fd4fd42b89649ba7ef01d059b3fab89e0f1">diff here</a>. It was merged into the code-base.</p>
<pre><code>-   println!(&quot;{:#}&quot;, doc);
+   assert_eq!(&quot;&lt;root&gt;\n  potato\n&lt;/root&gt;\n&quot;, format!(&quot;{:#}&quot;, doc));
</code></pre>
<h2 class="title is-4">Running mutation testing again</h2>
<pre><code>cargo mutants
...
337 mutants tested in 5m: 141 missed, 142 caught, 53 unviable, 1 timeouts
</code></pre>
<p>There are still 141 missed cases, but that's already 24 less than what we had earlier.</p>
<h2 class="title is-4">Conclusion</h2>
<p>Given that the test coverage is &quot;only&quot; 57.65% this might not be such a great example showing that &quot;high test coverage might not mean the code is really tested&quot;,
but still converting those <code>println!</code> macros to <code>assert_eq!</code> macros reduced the missed cases by 24.</p>
<p>We need to increase the test coverage in order to make sure the code does not accidently breaks in one place when some changes are introduced in another place.
At the same time we also need to monitor the reports from the mutant tests to make sure the tests indeed verify the behavior.</p>
<p>Unrelated note: What would be really nice if the two reports could be combined and it would emphasize the statements that were covered by the test coverage,
but still don't fail the tests if they are changed.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Access the process starting time everywhere</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-06-12T08:30:01Z</updated>
    <pubDate>2026-06-12T08:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/fixed-start-time" />
    <id>https://rust.code-maven.com/fixed-start-time</id>
    <content type="html"><![CDATA[<p>If you need to access the process starting time from several functions, then instead of passing it around or instead of using the <a href="/cache-the-result-of-a-function">caching</a>
we could use the <a href="https://doc.rust-lang.org/std/sync/struct.LazyLock.html">std::sync::LazyLock</a>.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/fixed-start-time/src/main.rs">examples/fixed-start-time/src/main.rs</a></strong></p>
<pre><code class="language-rust">use std::sync::LazyLock;
use std::time::SystemTime;

static START_TIME: LazyLock&lt;SystemTime&gt; = LazyLock::new(SystemTime::now);

fn main() {
    print_start_time();
    print_start_time();

}

fn print_start_time() {
    println!(&quot;{:?}&quot;, *START_TIME);
}

</code></pre>
<h2 class="title is-4">Output</h2>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/fixed-start-time/out.txt">examples/fixed-start-time/out.txt</a></strong></p>
<pre><code class="language-txt">SystemTime { tv_sec: 1781242831, tv_nsec: 637877888 }
SystemTime { tv_sec: 1781242831, tv_nsec: 637877888 }

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Cached dispatch table</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-06-11T13:00:01Z</updated>
    <pubDate>2026-06-11T13:00:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/cached-dispatch-table" />
    <id>https://rust.code-maven.com/cached-dispatch-table</id>
    <content type="html"><![CDATA[<p>We have lots of functions handling various cases.
These are divided into multiple modules based on the types of the cases.</p>
<p>The nice thing seem to be is creating a dispatch table mapping strings to functions.</p>
<p>Each module is responsible for returning a DispatchTable. There is a central function that
combines them.</p>
<p>We could generate this up-front and then pass the DispatchTable to each function but it seemed
better to get the DispatchTable internally.</p>
<p>If we do that we'll recreate the DispatchTable in every call. Using the <a href="https://crates.io/crates/cached">cached crate</a>
allows us to eliminate all the calls but the first one.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-dispatch-table/src/main.rs">examples/cache-dispatch-table/src/main.rs</a></strong></p>
<pre><code class="language-rust">use cached::macros::cached;

mod locations;
mod other;
mod types;

use crate::types::DispatchTable;

fn main() {
    for name in &amp;[&quot;city&quot;, &quot;state&quot;, &quot;country&quot;, &quot;language&quot;] {
        process(name);
    }
}

fn process(name: &amp;str) {
    let dispatch = get_dispatch();

    println!(&quot;Processing: {name}&quot;);
    if let Some(process_fn) = dispatch.get(name) {
        let result = process_fn();
        println!(&quot;{}&quot;, result);
    }
    println!();
}

#[cached]
fn get_dispatch() -&gt; DispatchTable {
    println!(&quot;get_dispatch called&quot;);

    let mut config = DispatchTable::new();

    let cfg = crate::locations::get_dispatch();
    for (key, value) in cfg {
        config.insert(key, value);
    }

    let cfg = crate::other::get_dispatch();
    for (key, value) in cfg {
        config.insert(key, value);
    }

    config
}

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-dispatch-table/src/locations.rs">examples/cache-dispatch-table/src/locations.rs</a></strong></p>
<pre><code class="language-rust">use crate::types::DispatchTable;

fn process_city() -&gt; &amp;'static str {
    &quot;Processing city of Seoul&quot;
}

fn process_country() -&gt; &amp;'static str {
    &quot;Processing country of Korea&quot;
}

pub(crate) fn get_dispatch() -&gt; DispatchTable {
    println!(&quot;get_dispatch for locations called&quot;);

    let mut config = DispatchTable::new();
    config.insert(&quot;city&quot;, process_city);
    config.insert(&quot;country&quot;, process_country);
    config
}

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-dispatch-table/src/other.rs">examples/cache-dispatch-table/src/other.rs</a></strong></p>
<pre><code class="language-rust">use crate::types::DispatchTable;

fn process_language() -&gt; &amp;'static str {
    &quot;Processing the Korean language&quot;
}

pub(crate) fn get_dispatch() -&gt; DispatchTable {
    println!(&quot;get_dispatch for locations called&quot;);

    let mut config = DispatchTable::new();
    config.insert(&quot;language&quot;, process_language);
    config
}

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-dispatch-table/src/types.rs">examples/cache-dispatch-table/src/types.rs</a></strong></p>
<pre><code class="language-rust">use std::collections::HashMap;

pub(crate) type Handler = fn() -&gt; &amp;'static str;
pub(crate) type DispatchTable = HashMap&lt;&amp;'static str, Handler&gt;;

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-dispatch-table/out.txt">examples/cache-dispatch-table/out.txt</a></strong></p>
<pre><code class="language-txt">get_dispatch called
get_dispatch for locations called
get_dispatch for locations called
Processing: city
Processing city of Seoul

Processing: state

Processing: country
Processing country of Korea

Processing: language
Processing the Korean language


</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-dispatch-table/Cargo.toml">examples/cache-dispatch-table/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;cache-dispatch-table&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
cached = &quot;2.0.2&quot;

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Cache the result of a function HashMap</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-06-11T12:30:01Z</updated>
    <pubDate>2026-06-11T12:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/cache-the-hashmap-result-of-a-function" />
    <id>https://rust.code-maven.com/cache-the-hashmap-result-of-a-function</id>
    <content type="html"><![CDATA[<p>Caching the result of a function using the <a href="https://crates.io/crates/cached">cached crate</a></p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-hashmap-result-of-function/src/main.rs">examples/cache-hashmap-result-of-function/src/main.rs</a></strong></p>
<pre><code class="language-rust">use std::collections::HashMap;
use cached::macros::cached;

fn main() {
    let config = get_config();
    println!(&quot;Config: {:?}&quot;, config);

    let config = get_config();
    println!(&quot;Config: {:?}&quot;, config);
}


#[cached]
fn get_config() -&gt; HashMap&lt;&amp;'static str, String&gt; {
    println!(&quot;get_config called&quot;);

    let mut config = HashMap::new();
    config.insert(&quot;city&quot;, String::from(&quot;Seoul&quot;));
    config.insert(&quot;country&quot;, String::from(&quot;Korea&quot;));
    config
}




</code></pre>
<p>The function runs only once.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-hashmap-result-of-function/out.txt">examples/cache-hashmap-result-of-function/out.txt</a></strong></p>
<pre><code class="language-txt">get_config called
Config: {&quot;country&quot;: &quot;Korea&quot;, &quot;city&quot;: &quot;Seoul&quot;}
Config: {&quot;country&quot;: &quot;Korea&quot;, &quot;city&quot;: &quot;Seoul&quot;}

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-hashmap-result-of-function/Cargo.toml">examples/cache-hashmap-result-of-function/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;cache-hashmap-result-of-function&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
cached = &quot;2.0.2&quot;

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Cache the result of a function</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-06-11T11:30:01Z</updated>
    <pubDate>2026-06-11T11:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/cache-the-result-of-a-function" />
    <id>https://rust.code-maven.com/cache-the-result-of-a-function</id>
    <content type="html"><![CDATA[<p>I have some code where I wanted to cache the result of a function. I found the <a href="https://crates.io/crates/cached">cached crate</a> to be useful.</p>
<p>Here is the first experiment with it showing how it caches the value in one function, but not in the other.
The first 2 tv_nsec values differ, as time have elapsed between the calls.
The 3rd and 4th tv_nsec values are the same as the value got cached after the first call.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-result-of-function/src/main.rs">examples/cache-result-of-function/src/main.rs</a></strong></p>
<pre><code class="language-rust">use std::time::SystemTime;
use cached::macros::cached;

fn main() {
    let time = get_current_time();
    println!(&quot;Current time: {:?}&quot;, time);
    let time = get_current_time();
    println!(&quot;Current time: {:?}&quot;, time);


    let time = get_cached_time();
    println!(&quot;Cacehed time: {:?}&quot;, time);
    let time = get_cached_time();
    println!(&quot;Cacehed time: {:?}&quot;, time);
}

fn get_current_time() -&gt; SystemTime {
    SystemTime::now()
}


#[cached]
fn get_cached_time() -&gt; SystemTime {
    SystemTime::now()
}

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-result-of-function/out.txt">examples/cache-result-of-function/out.txt</a></strong></p>
<pre><code class="language-txt">Current time: SystemTime { tv_sec: 1781167332, tv_nsec: 68780987 }
Current time: SystemTime { tv_sec: 1781167332, tv_nsec: 68846651 }
Cacehed time: SystemTime { tv_sec: 1781167332, tv_nsec: 68882989 }
Cacehed time: SystemTime { tv_sec: 1781167332, tv_nsec: 68882989 }

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/cache-result-of-function/Cargo.toml">examples/cache-result-of-function/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;cache-result-of-function&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
cached = &quot;2.0.2&quot;

</code></pre>
<p>If you only want to store a timestamp then there are better solutions as well. For example check out <a href="/fixed-start-time">the starting time of the process</a>.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Clippy: Multiple crate versions</title>
    <summary type="html"><![CDATA[Should we invest energy avoiding the same crate twice as our dependency?]]></summary>
    <updated>2026-04-18T09:30:01Z</updated>
    <pubDate>2026-04-18T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/multiple-crate-versions" />
    <id>https://rust.code-maven.com/multiple-crate-versions</id>
    <content type="html"><![CDATA[<p>Adding</p>
<pre><code class="language-toml">[lints.clippy]
cargo        = { priority = -1, level = &quot;deny&quot; }
</code></pre>
<p>to <code>Cargo.toml</code> will also turn on the <a href="https://rust-lang.github.io/rust-clippy/rust-1.95.0/index.html#multiple_crate_versions">multiple_crate_versions</a> rule.</p>
<p>It will them complain if the same create was added more than once (with different version numbers) to <code>Cargo.lock</code>.</p>
<h2 class="title is-4">How could this happen?</h2>
<h2 class="title is-4">What to do about it?</h2>
<ol>
<li>We can decide to disregard this rule. Add the following line to <code>Cargo.toml</code></li>
</ol>
<pre><code>[lints.clippy]
multiple_crate_versions = &quot;allow&quot;
</code></pre>
<ol start="2">
<li>Tell Clippy about the specific crates for which we allow the duplication:</li>
</ol>
<p>Create the <code>clippy.toml</code> file and add the following entry, with the names of the crates we allow to be duplicated:</p>
<pre><code class="language-toml">allowed-duplicate-crates = [
    &quot;async-channel&quot;,
    &quot;event-listener&quot;,
    &quot;foldhash&quot;,
    &quot;hashbrown&quot;,
    &quot;hashlink&quot;,
    &quot;wit-bindgen&quot;,
]
</code></pre>
<p>See <a href="https://doc.rust-lang.org/nightly/clippy/lint_configuration.html#allowed-duplicate-crates">allowed-duplicate-crates</a>.</p>
<ol start="3">
<li>
<p>Figure out which of our dependencies brought in these dependencies and either replace our own dependencies, or send a Pull-Request to our dependencies to allow for more flexibility.</p>
</li>
</ol>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Zed - enable inlay type hints for Rust projects</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-12T11:30:01Z</updated>
    <pubDate>2026-02-12T11:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/zed-enable-inlay-type-hints-for-rust" />
    <id>https://rust.code-maven.com/zed-enable-inlay-type-hints-for-rust</id>
    <content type="html"><![CDATA[<p>Inlay hints or inline type hints allow you to see the derived types of a variable.</p>
<p>For example when you assign the return value of a function to a variable but you don't explicitely write the type of the variable,
Rust will derive (deduct) the type based on the function signature.</p>
<p>If you declare a variable <code>let x = 2;</code>, Rust will derived that it is an <code>i32</code> and the inlay type hints will show <code>let x: i32 = 2;</code>.</p>
<p>In another case if add together two variables holding numbers (that default to <code>i32</code>) and declare the resulting variable to be <code>i8</code>
then Rust will derived that the original two variables also must be <code>i8</code>.</p>
<p>So</p>
<pre><code class="language-rust">    let x = 2;
    let y = 3;
</code></pre>
<p>is understood as</p>
<pre><code class="language-rust">    let x: i32 = 2;
    let y: i32 = 3;
</code></pre>
<p>but</p>
<pre><code class="language-rust">    let x = 2;
    let y = 3;
    let z: i8 = x +y;
</code></pre>
<p>is understood as</p>
<pre><code class="language-rust">    let x: i8 = 2;
    let y: i8 = 3;
    let z: i8 = x +y;
</code></pre>
<p>The inlay type hints will help you understand this.</p>
<h2 class="title is-4">Inline (inlay) type hints:</h2>
<p>I configured the following to make it work. I am not sure everything is really needed.</p>
<ul>
<li>Installed rust-analyzers</li>
</ul>
<pre><code>rustup component add rust-analyzer
</code></pre>
<ul>
<li>settings.json</li>
</ul>
<p>In the <code>settings.json</code> file I added the following:</p>
<pre><code class="language-json">  &quot;inlay_hints&quot;: {
    &quot;enabled&quot;: true,
  },
  &quot;enable_language_server&quot;: true,
  &quot;lsp&quot;: {
    &quot;rust-analyzer&quot;: {
      &quot;binary&quot;: {
        &quot;path&quot;: &quot;/home/gabor/.cargo/bin/rust-analyzer&quot;
      },
      &quot;initialization_options&quot;: {
        &quot;inlayHints&quot;: {
          &quot;maxLength&quot;: null,
          &quot;lifetimeElisionHints&quot;: {
            &quot;enable&quot;: &quot;always&quot;,
            &quot;useParameterNames&quot;: true,
          },
          &quot;closureReturnTypeHints&quot;: {
            &quot;enable&quot;: &quot;always&quot;,
          },
        },
      },
    },
  },
</code></pre>
<ul>
<li>Trusted code</li>
</ul>
<p>Opened the crate I was working on as a &quot;project&quot; and then in the top-left corner of the IDE I clicked on &quot;Trusted project&quot;.</p>
<p>Then I could also use <code>Crtl-:</code> to toggle the inline hint.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Embed time of compilation and other build-time information in a rust binary</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-06T09:30:01Z</updated>
    <pubDate>2026-02-06T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/embed-compile-time-data" />
    <id>https://rust.code-maven.com/embed-compile-time-data</id>
    <content type="html"><![CDATA[<p>Sometimes it is useful to be able to show information about the compilation of a rust crate.</p>
<p>For example the date and time when it was compiled.</p>
<h2 class="title is-4">Cargo.toml</h2>
<p>We need to add the <a href="https://crates.io/crates/built">built</a> crate as a build-time dependency.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/embed-build-time-data/Cargo.toml">examples/embed-build-time-data/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;embed-build-time-data&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]

[build-dependencies]
built = { version = &quot;0.8&quot;, features = [&quot;cargo-lock&quot;, &quot;dependency-tree&quot;, &quot;chrono&quot;, &quot;git2&quot;, &quot;semver&quot;] }


</code></pre>
<h2 class="title is-4">build.rs</h2>
<p>We need to create <code>build.rs</code> in the root of the crate.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/embed-build-time-data/build.rs">examples/embed-build-time-data/build.rs</a></strong></p>
<pre><code class="language-rust">fn main() {
    built::write_built_file().expect(&quot;Failed to acquire build-time information&quot;)
}

</code></pre>
<h2 class="title is-4">main.rs</h2>
<p>We can then access the data in our code during run-time.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/embed-build-time-data/src/main.rs">examples/embed-build-time-data/src/main.rs</a></strong></p>
<pre><code class="language-rust">mod built_info {
    include!(concat!(env!(&quot;OUT_DIR&quot;), &quot;/built.rs&quot;));
}

fn main() {
    println!(&quot;TARGET                {:?}&quot;, built_info::TARGET);
    println!(&quot;PKG_VERSION           {:?}&quot;, built_info::PKG_VERSION);
    println!(&quot;RUSTC_VERSION         {:?}&quot;, built_info::RUSTC_VERSION);

    println!(&quot;GIT_VERSION           {:?}&quot;, built_info::GIT_VERSION);
    println!(&quot;GIT_DIRTY             {:?}&quot;, built_info::GIT_DIRTY);
    println!(&quot;GIT_COMMIT_HASH       {:?}&quot;, built_info::GIT_COMMIT_HASH);
    println!(
        &quot;GIT_COMMIT_HASH_SHORT {:?}&quot;,
        built_info::GIT_COMMIT_HASH_SHORT
    );

    println!(&quot;BUILT_TIME_UTC        {:?}&quot;, built_info::BUILT_TIME_UTC);

    println!(&quot;CI_PLATFORM           {:?}&quot;, built_info::CI_PLATFORM);
}

</code></pre>
<h2 class="title is-4">Output</h2>
<pre><code>$cargo run

TARGET                &quot;x86_64-unknown-linux-gnu&quot;
PKG_VERSION           &quot;0.1.0&quot;
RUSTC_VERSION         &quot;rustc 1.93.0 (254b59607 2026-01-19)&quot;
GIT_VERSION           Some(&quot;9c6447a&quot;)
GIT_DIRTY             Some(true)
GIT_COMMIT_HASH       Some(&quot;9c6447a01046142ccf471a597f21d2c08c67c2cd&quot;)
GIT_COMMIT_HASH_SHORT Some(&quot;9c6447a&quot;)
BUILT_TIME_UTC        &quot;Fri, 6 Feb 2026 10:42:50 +0000&quot;
CI_PLATFORM           None
</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Adding the repository field to Cargo.toml</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-01-27T08:30:01Z</updated>
    <pubDate>2026-01-27T08:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/adding-repository-to-cargo-toml-video" />
    <id>https://rust.code-maven.com/adding-repository-to-cargo-toml-video</id>
    <content type="html"><![CDATA[<ul>
<li><a href="https://osdc.code-maven.com/rust">OSDC Rust</a></li>
</ul>
<iframe width="560" height="315" src="https://www.youtube.com/embed/MPnaIxOTbLA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>00:00 Introduction</li>
<li>00:30 Open source contributors are volunteers</li>
<li>01:15 How to select an open source project to contribute to?</li>
<li>03:30 Select a recently updated project on GitHub.</li>
<li>05:08 <a href="https://rust-digger.code-maven.com/">Rust Digger</a></li>
<li>06:33 A crate that has no repository link... and one that has.</li>
<li>09:40 Check the <a href="https://github.com/hoodie/dvb-rs/pull/8">previous Pull-Request</a> adding the repository field to <a href="https://crates.io/crates/dvb">dvb</a></li>
<li>11:05 Picking the <a href="https://rust-digger.code-maven.com/crates/spyne-syntax">spyne-syntax</a> crate.</li>
<li>12:40 The GitHub account of <a href="https://github.com/ZA1815/">Zaid Ahmed</a>, finding the repository of spyne-syntax</li>
<li>15:45 Making the change to Cargo.toml, fork the repository</li>
<li>17:55 Commit the change, decide on the commit message.</li>
<li>20:50 Explain the change on the trailing line.</li>
<li>21:50 The <a href="https://github.com/szabgab/rust-digger/issues/89">issue</a> where I collect the PRs.</li>
<li>25:00 We finished the Pull-Request.</li>
<li>25:10 Some PRs take time to get accepted.</li>
<li>27:40 Offering driver-navigator pair-programming.</li>
<li>29:05 Radek: Is there some automatic evaluation of the PR?</li>
<li>30:00 GitHub Actions, tests, co-pilot integration.</li>
<li>34:45 Karol is volunteering to do a PR.</li>
<li>35:50 Karol start sharing his screen.</li>
<li>36:54 Picking the <a href="https://crates.io/crates/kftray-helper">kftray-helper</a> crate to work on.</li>
<li>38:50 A <a href="https://github.com/hcavarsan/kftray">repository</a> with multiple creates.</li>
<li>46:05 CodeRabbit skipped the review.</li>
<li>46:30 Google CLA - The legal issues.</li>
<li>51:10 Baby steps! <a href="https://osdc.code-maven.com/rust#chat">Chat with us</a></li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Testing registration with email verification process</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-12-25T16:30:01Z</updated>
    <pubDate>2025-12-25T16:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/testing-registration-process" />
    <id>https://rust.code-maven.com/testing-registration-process</id>
    <content type="html"><![CDATA[<p>In many web-based application the process of registration includes a step of email verification.
The process is more or less this:</p>
<ol>
<li>The user types in an email address (and some other date)</li>
<li>The system checks that the looks ok, including the format of the email address. (e.g. that it is not empty)</li>
<li>Then it generates a unique code and stores all the received data and the unique code in the database.</li>
<li>Then it send an email to the given address containing a URL with the unique code.</li>
<li>When the user receives the email and clicks on the link the web system receives this verification request and can update the records marking the email as verified.</li>
</ol>
<p>There can and probably should be a number of extra things in the process.</p>
<ul>
<li>For example the database should contain an expiration date for the code.</li>
</ul>
<p>The question though, how do you test this code? Do you let the system send out real emails on every run? That would be slow and the test would need to rely an external service that will receive the email from where the test can download it for verification.</p>
<p>One solution for this is to save the email message in a file during the tests and make the tests read that file.</p>
<p>This is what you can see in this similified example.</p>
<h2 class="title is-4">Cargo.toml</h2>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/testing-email-sending/Cargo.toml">examples/testing-email-sending/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;mail-sender&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
anyhow = &quot;1.0.102&quot;
clap = { version = &quot;4.5.60&quot;, features = [&quot;derive&quot;] }
lettre = { version = &quot;0.11.21&quot;, features = [&quot;file-transport&quot;, &quot;sendmail-transport&quot;] }
uuid = &quot;1.23.1&quot;

</code></pre>
<h2 class="title is-4">main.rs</h2>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/testing-email-sending/src/main.rs">examples/testing-email-sending/src/main.rs</a></strong></p>
<pre><code class="language-rust">use clap::Parser;
use lettre::{FileTransport, Message, SendmailTransport, Transport, message::header::ContentType};

#[derive(Parser)]
struct Cli {
    #[arg(long)]
    from: String,

    #[arg(long)]
    to: String,
}

fn main() {
    let args = Cli::parse();

    // We get this from the command line.
    // In a real application it would come from a config file.
    let from = &amp;args.from;

    // This is what the user entered when registering.
    let user_email = args.to.clone();

    register(from, &amp;user_email);
}

fn register(admin_email: &amp;str, user_email: &amp;str) -&gt; String {
    // This code is saved to the database and emailed to the user.
    let code = uuid::Uuid::new_v4().to_string();

    let subject = String::from(&quot;Email sent to confirm registration&quot;);
    let body = format!(&quot;Welcome! Use this code {code} to verify your email address.&quot;);

    let email = Message::builder()
        .from(admin_email.parse().unwrap())
        .to(user_email.parse().unwrap())
        .subject(subject)
        .header(ContentType::TEXT_PLAIN)
        .body(body)
        .unwrap();

    if cfg!(test) {
        let dirname = &quot;.&quot;;
        let sender = FileTransport::new(dirname);
        let filename = sender.send(&amp;email).unwrap();
        format!(&quot;{filename}.eml&quot;)
    } else {
        println!(&quot;Sending email to {}&quot;, user_email);
        let sender = SendmailTransport::new();
        sender.send(&amp;email).unwrap();
        String::new()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_register_creates_valid_email() {
        let filename = register(&quot;admin@example.com&quot;, &quot;user@example.com&quot;);
        let content = std::fs::read_to_string(filename).unwrap();

        assert!(content.contains(&quot;From: admin@example.com&quot;));
        assert!(content.contains(&quot;To: user@example.com&quot;));
        assert!(content.contains(&quot;Subject: Email sent to confirm registration&quot;));
        assert!(content.contains(&quot;Welcome! Use this code&quot;));

        let code_start =
            content.find(&quot;Welcome! Use this code &quot;).unwrap() + &quot;Welcome! Use this code &quot;.len();
        let code_end = content.find(&quot; to verify your&quot;).unwrap();
        let _code = &amp;content[code_start..code_end];

        // We can then use the code to verify the user in the test.
    }
}

</code></pre>
<h2 class="title is-4">Config test</h2>
<p>We can either use</p>
<pre><code class="language-rust">#[cfg(test)]
</code></pre>
<p>and</p>
<pre><code class="language-rust">#[cfg(not(test))]
</code></pre>
<p>or we can use</p>
<pre><code class="language-rust">if cfg!(test) {
    ...
} else {
    ...
}
</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Mail sender using the lettre crate</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-12-25T13:30:01Z</updated>
    <pubDate>2025-12-25T13:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/mail-sender" />
    <id>https://rust.code-maven.com/mail-sender</id>
    <content type="html"><![CDATA[<p><a href="https://crates.io/crates/lettre">lettre</a></p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/mail-sender/Cargo.toml">examples/mail-sender/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;mail-sender&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
anyhow = &quot;1.0.102&quot;
clap = { version = &quot;4.5.60&quot;, features = [&quot;derive&quot;] }
lettre = { version = &quot;0.11.21&quot;, features = [&quot;file-transport&quot;, &quot;sendmail-transport&quot;] }

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/mail-sender/src/main.rs">examples/mail-sender/src/main.rs</a></strong></p>
<pre><code class="language-rust">use clap::Parser;
use lettre::{FileTransport, Message, SendmailTransport, Transport, message::header::ContentType};
use std::io::Read;

#[derive(Parser)]
struct Cli {
    #[arg(long)]
    from: String,

    #[arg(long)]
    to: String,

    #[arg(long)]
    subject: String,

    #[arg(long)]
    dir: Option&lt;String&gt;,
}

fn main() {
    let args = Cli::parse();
    let mut body = String::new();
    std::io::stdin().read_to_string(&amp;mut body).unwrap();

    let email = Message::builder()
        .from(args.from.parse().unwrap())
        .to(args.to.parse().unwrap())
        .subject(args.subject)
        .header(ContentType::TEXT_PLAIN)
        .body(body)
        .unwrap();

    match args.dir {
        Some(dirname) =&gt; {
            let sender = FileTransport::new(dirname);
            let filename = sender.send(&amp;email).unwrap();
            println!(&quot;{filename}.eml&quot;);
        }
        None =&gt; {
            let sender = SendmailTransport::new();
            sender.send(&amp;email).unwrap();
        }
    }
}

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Generate (hash) a password using Argon2</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-11-19T11:30:01Z</updated>
    <pubDate>2025-11-19T11:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/hash-a-password" />
    <id>https://rust.code-maven.com/hash-a-password</id>
    <content type="html"><![CDATA[<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/hash-password/Cargo.toml">examples/hash-password/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;hash-password&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
argon2 = { version = &quot;0.5.3&quot;, features = [&quot;std&quot;] }

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/hash-password/src/main.rs">examples/hash-password/src/main.rs</a></strong></p>
<pre><code class="language-rust">use argon2::{
    Argon2,
    password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString, rand_core::OsRng},
};
use std::io::{self, Write};

fn main() {
    // Get password from user input
    print!(&quot;Enter password to hash: &quot;);
    io::stdout().flush().unwrap();

    let mut input = String::new();
    io::stdin().read_line(&amp;mut input).unwrap();
    let password = input.trim().as_bytes();

    // Generate a random salt
    let salt = SaltString::generate(&amp;mut OsRng);

    // Initialize Argon2 with default configuration
    let argon2 = Argon2::default();

    // Hash the password
    let password_hash = argon2.hash_password(password, &amp;salt).unwrap();

    println!(&quot;\nPassword hash: {}&quot;, password_hash);

    // Demonstrate verification
    println!(&quot;\nVerifying the password...&quot;);
    let hash_string = password_hash.to_string();
    println!(&quot;\nPassword hash: {}&quot;, hash_string);
    let parsed_hash = PasswordHash::new(&amp;hash_string).unwrap();

    match argon2.verify_password(password, &amp;parsed_hash) {
        Ok(_) =&gt; println!(&quot;✓ Password verification successful!&quot;),
        Err(_) =&gt; println!(&quot;✗ Password verification failed!&quot;),
    }
}

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>GitHub Actions for Rust projects</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-07-06T12:30:01Z</updated>
    <pubDate>2025-07-06T12:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/github-actions" />
    <id>https://rust.code-maven.com/github-actions</id>
    <content type="html"><![CDATA[<p>Using <code>ubuntu-latests</code>, <code>macos-latest</code>, or <code>windows-latests</code> will automatically bring you the most recent stable version of the Rust compiler. <a href="/default-github-workflow-for-rust-on-linux">see this example</a>.</p>
<p>This is nice as you won't need to worry about updating it, but it has the obvious disadvantage that the rust compiler automatically changes without you making any change in the configuration.</p>
<p>Many projects use the <a href="https://github.com/actions-rs/toolchain">actions-rs/toolchain</a>, but it has been deprecated on October 13, 2023.</p>
<p>Many use <a href="https://github.com/dtolnay/rust-toolchain">dtolnay/rust-toolchain</a> to set the toolchain(s) explicitely. You can either set a specific version number or you can use the words:
<code>stable</code> for the most recent stable version, <code>beta</code> for the next version, <code>nightly</code> for wilde development efforts.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/github-workflows/matrix.yml">examples/github-workflows/matrix.yml</a></strong></p>
<pre><code class="language-yaml">name: Matrix
on:
  - pull_request
  - push
jobs:
  main:
    strategy:
      matrix:
        rust:
          - stable
          - beta
          - nightly
          - 1.78
          - 1.88
    name: ${{matrix.rust}}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{matrix.rust}}
          components: rustfmt, clippy
      - run: rustup --version
      - run: rustc -vV

      - run: cargo clippy -- --deny clippy::pedantic
      - run: cargo fmt --all -- --check
      - run: cargo test
        #      - run: cargo install cargo-tarpaulin &amp;&amp; cargo tarpaulin --out Xml
        #      - uses: codecov/codecov-action@v1


</code></pre>
<h2 class="title is-4">GitHub Actions</h2>
<p>Popular GitHub Actions used by Rust Crates.</p>
<ul>
<li>
<p><a href="https://github.com/dtolnay/rust-toolchain">dtolnay/rust-toolchain</a> to install the right toolchain(s),  target(s), and component(s).</p>
</li>
<li>
<p><a href="https://github.com/bnjbvr/cargo-machete">bnjbvr/cargo-machete</a> to remove unused Rust dependencies</p>
</li>
<li>
<p><a href="https://github.com/Swatinem/rust-cache">Swatinem/rust-cache</a> smart caching for rust/cargo projects with sensible defaults to reduce compilation time.</p>
</li>
</ul>
<h2 class="title is-4">Cargo commands</h2>
<p>Various cargo commands I saw in the GitHub Workflows</p>
<pre><code>cargo build --verbose
</code></pre>
<pre><code>cargo test --verbose
</code></pre>
<pre><code>cargo fmt
cargo fmt -- --check
cargo fmt -- --all --check
</code></pre>
<pre><code>cargo clippy
cargo clippy -- --deny clippy::pedantic
cargo clippy --all-targets ${{ matrix.feature }} -- -D warnings
    // where the matrix.feature field can be ['', '--no-default-features', '--all-features']
</code></pre>
<pre><code>cargo doc --no-deps --all-features
</code></pre>
<h2 class="title is-4">GitHub Workflow elements</h2>
<pre><code class="language-yaml">env:
  CARGO_TERM_COLOR: always
</code></pre>
<h2 class="title is-4">Caching with the generic cache action</h2>
<p>Using <a href="https://github.com/actions/cache">actions/cache</a> (but see the rust-cachec above)</p>
<pre><code class="language-yaml">      - name: Cache cargo registry
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-
</code></pre>
<h2 class="title is-4">Verify git tag matches Cargo.toml version</h2>
<pre><code>      - name: Verify tag matches Cargo.toml version
        run: |
          TAG_VERSION=${GITHUB_REF#refs/tags/v}
          CARGO_VERSION=$(grep '^version = ' Cargo.toml | sed 's/version = &quot;\(.*\)&quot;/\1/')
          echo &quot;Tag version: $TAG_VERSION&quot;
          echo &quot;Cargo.toml version: $CARGO_VERSION&quot;
          if [ &quot;$TAG_VERSION&quot; != &quot;$CARGO_VERSION&quot; ]; then
            echo &quot;Error: Tag version ($TAG_VERSION) does not match Cargo.toml version ($CARGO_VERSION)&quot;
            exit 1
          fi
</code></pre>
<h2 class="title is-4">Publish to crates.io</h2>
<pre><code>      - name: Publish to crates.io
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust in Hebrew</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-18T11:30:01Z</updated>
    <pubDate>2025-06-18T11:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-in-hebrew" />
    <id>https://rust.code-maven.com/rust-in-hebrew</id>
    <content type="html"><![CDATA[<p>I already collected all the resource related to <a href="https://rust.org.il/">Rust in Israel</a> including our <a href="https://rust.org.il/community">communities</a> so for now I won't duplicate that
information here, but at least there is a page now.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust in Spanish - Rust en Español</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-18T09:50:01Z</updated>
    <pubDate>2025-06-18T09:50:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-in-spanish" />
    <id>https://rust.code-maven.com/rust-in-spanish</id>
    <content type="html"><![CDATA[<p>Everything about Rust in Spanish.</p>
<h2 class="title is-4">Rust en Castellano, en todo de mundo:</h2>
<ul>
<li><a href="https://rustlang-es.org/">Rust Lang En Español</a></li>
</ul>
<hr />
<ul>
<li><a href="https://github.com/RustLangES">GitHub: RustLang en Español - Comunidad de Rustlang en Español</a></li>
<li><a href="https://www.linkedin.com/company/rustlanges">LinkedIn company: Comunidad de RustLang en Español</a></li>
<li><a href="https://www.linkedin.com/groups/12917518/">LinkedIn group: RustLang en Español</a></li>
<li><a href="https://t.me/rust_es">Telegram: Programación Rust</a></li>
<li><a href="https://reddit.com/r/rustlanges">Reddit: r/rustlanges</a></li>
<li><a href="https://www.instagram.com/rustlanges/">Instagram: rustlanges</a></li>
<li><a href="https://x.com/rust_lang_es">X/Twitter</a></li>
<li><a href="https://mastodon.social/@rustlanges">Mastodon</a></li>
<li><a href="https://www.youtube.com/@RustLangEnEspa%C3%B1ol">YouTube: RustLang en Español</a></li>
<li><a href="https://www.twitch.tv/rustlanges">Twitch: RustLangES</a></li>
</ul>
<h2 class="title is-4">Libros</h2>
<ul>
<li><a href="https://book.rustlang-es.org/">El Lenguaje de Programación Rust</a></li>
<li><a href="https://google.github.io/comprehensive-rust/es/index.html">Comprehensive Rust</a></li>
<li><a href="https://embedded-book.rustlang-es.org/">Rust en Embedidos</a></li>
<li><a href="https://dotnet-book.rustlang-es.org/">Rust para C#/.NET Developers</a></li>
<li><a href="https://go-book.rustlang-es.org/es/">Rust para Go Developers</a></li>
</ul>
<h2 class="title is-4">Grupos de Meetup</h2>
<ul>
<li>
<p><a href="/user-groups-by-country">Busca para los paises hispanohablantes</a></p>
</li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust meetup and user groups by country</title>
    <summary type="html"><![CDATA[There are many Rust user groups around the world. Here is the full list by country, state, and city along with the number of members.]]></summary>
    <updated>2025-06-18T08:30:01Z</updated>
    <pubDate>2025-06-18T08:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/user-groups-by-country" />
    <id>https://rust.code-maven.com/user-groups-by-country</id>
    <content type="html"><![CDATA[<p>There are many Rust user groups around the world. Here is the full list by country, state, and city along with the number of members.</p>
<h2 class="title is-4">Argentina</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-argentina/">Rust Argentina</a> (1,135 members) - Buenos Aires</p>
</li>
</ul>
<h2 class="title is-4">Australia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Melbourne/">Rust Melbourne</a> (1,170 members) - Melbourne</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Sydney/">Rust Sydney</a> (934 members) - Sydney</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Brisbane/">Rust Brisbane</a> (450 members) - Brisbane</p>
</li>
<li>
<p><a href="https://www.meetup.com/perth-rust-meetup-group/">Rust Perth Meetup Group</a> (128 members) - Perth</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-canberra/">Canberra Rust User Group</a> (109 members) - Canberra</p>
</li>
</ul>
<h2 class="title is-4">Austria</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/de-DE/rust-linz/">Rust Linz</a> (1,176 members) - Linz</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-vienna/">Rust Vienna</a> (619 members) - Vienna</p>
</li>
</ul>
<h2 class="title is-4">Belgium</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/belgium-rust-user-group/">Belgium Rust user group</a> (238 members) - Brussels</p>
</li>
</ul>
<h2 class="title is-4">Brazil</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Sao-Paulo-Meetup/">Rust São Paulo Meetup</a> (1,314 members) - São Paulo</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Rio/">Rust Rio</a> (109 members) - Rio de Janeiro</p>
</li>
</ul>
<h2 class="title is-4">Canada</h2>
<h3 class="title is-5">AB</h3>
<ul>
<li><a href="https://www.eventbrite.ca/o/rust-calgary-63449860593">Calgary Rust</a> (30 members) - Calgary</li>
</ul>
<h3 class="title is-5">BC</h3>
<ul>
<li><a href="https://www.meetup.com/vancouver-rust/">Vancouver Rust</a> (1,351 members) - Vancouver</li>
</ul>
<h3 class="title is-5">ON</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-Toronto/">Rust Toronto</a> (648 members) - Toronto</li>
<li><a href="https://www.meetup.com/Rust-KW/">Rust KW</a> (315 members) - Kitchener</li>
</ul>
<h3 class="title is-5">QC</h3>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Montreal/">Rust Montréal</a> (335 members) - Montréal</p>
</li>
</ul>
<h2 class="title is-4">China</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/wasm-rust-meetup">WebAssembly and Rust Meetup (Wasm Empowering AI)</a> (421 members) - Beijing</p>
</li>
<li>
<p><a href="https://github.com/RPG-Alex/rust-chengdu">Chengdu</a> (0 members) - Chengdu</p>
</li>
</ul>
<h2 class="title is-4">Colombia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-medellin/">Rust Medellin</a> (318 members) - Medellin</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-colombia/">Rust Colombia</a> (155 members) - Medellín</p>
</li>
</ul>
<h2 class="title is-4">Croatia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/zagreb-rust-meetup/">impl Zagreb for Rust</a> (226 members) - Zagreb</p>
</li>
</ul>
<h2 class="title is-4">Czech Republic</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-prague/">Rust Prague</a> (448 members) - Prague</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-czech-republic/">Rust Czech Republic</a> (260 members) - Prague</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-moravia">Rust Moravia</a> (98 members) - Olomouc</p>
</li>
</ul>
<h2 class="title is-4">Denmark</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/copenhagen-rust-community/">Copenhagen Rust Community</a> (865 members) - Copenhagen</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-aarhus/">Rust Aarhus</a> (467 members) - Aarhus</p>
</li>
</ul>
<h2 class="title is-4">France</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Paris/">Rust Paris</a> (1,799 members) - Paris</p>
</li>
<li>
<p><a href="https://www.meetup.com/Montpellier-Rust-Meetup/">Montpellier Rust Meetup</a> (315 members) - Montpellier</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-lyon/">Rust Lyon</a> (315 members) - Lyon</p>
</li>
<li>
<p><a href="https://www.meetup.com/meetup-group-zgphbyet/">Rust Lille</a> (299 members) - Lille</p>
</li>
</ul>
<h2 class="title is-4">Georgia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/tbilisi-rustaceans/">Rust Tbilisi</a> (151 members) - Tbilisi</p>
</li>
</ul>
<h2 class="title is-4">Germany</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-berlin/">Rust Berlin</a> (3,435 members) - Berlin</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-munich/">Rust Munich</a> (1,546 members) - München</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-noris/">Rust Nuremberg</a> (967 members) - Nürnberg</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustcologne/">Rust Cologne</a> (796 members) - Köln</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Meetup-Hamburg/">Rust Meetup Hamburg</a> (763 members) - Hamburg</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-rhein-main/">Rust Rhein-Main</a> (296 members) - Darmstadt</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Hack-Learn-Karlsruhe/">Rust Hack &amp; Learn Karlsruhe</a> (233 members) - Karlsruhe</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/">Rust - Modern Systems Programming in Leipzig</a> (168 members) - Leipzig</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-frankfurt">Rust Frankfurt</a> (117 members) - Frankfurt</p>
</li>
<li>
<p><a href="https://www.meetup.com/paessler-rust-camp-2024/">Paessler Rust Camp 2024</a> (62 members) - Nürnbert</p>
</li>
</ul>
<h2 class="title is-4">India</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rustox/">Rust India</a> (2,700 members) - Bangalore</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustdelhi/">Rust Delhi</a> (<a href="https://rustdelhi.in/">web</a>) (1,446 members) - Delhi</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Hyderabad/">Rust Language Hyderabad</a> (1,106 members) - Hyderabad</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-pune">Rust Pune</a> (565 members) - Pune</p>
</li>
</ul>
<h2 class="title is-4">Indonesia</h2>
<ul>
<li>
<p><a href="https://github.com/rustid/meetup">Rust Indonesia</a> (0 members) - Jakarta ?</p>
</li>
</ul>
<h2 class="title is-4">Ireland</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-dublin/">Rust Dublin</a> (1,086 members) - Dublin</p>
</li>
</ul>
<h2 class="title is-4">Israel</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-tlv/">Rust TLV</a> (<a href="https://rust.org.il/">web</a>) (1,343 members) - Tel Aviv-Yafo</p>
</li>
</ul>
<h2 class="title is-4">Italy</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-lang-Milano/">Rust Language Milano</a> (636 members) - Milano</p>
</li>
<li>
<p><a href="https://www.meetup.com/it-IT/Rust-Roma/">Rust Roma</a> (425 members) - Roma</p>
</li>
</ul>
<h2 class="title is-4">Japan</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/tokyo-rust-meetup/">Tokyo Rust Meetup</a> (801 members) - Tokyo</p>
</li>
</ul>
<h2 class="title is-4">Lithuania</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/vilnius-rust-go-meetup-group/">Vilnius Rust and Go Meetup Group</a> (292 members) - Vilnius</p>
</li>
</ul>
<h2 class="title is-4">Malaysia</h2>
<ul>
<li>
<p><a href="https://rust-malaysia.github.io/meetup/">Rust Malaysia</a> (0 members) - Kuala Lumpur</p>
</li>
</ul>
<h2 class="title is-4">Mexico</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-MX/">Rust MX</a> (1,192 members) - México City</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustlangmx/">Rust Lang Comunidad Mexico</a> (107 members) - Guadalajara</p>
</li>
</ul>
<h2 class="title is-4">Netherlands</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-nederland/">Rust Nederland</a> (1,883 members) - Amsterdam</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-getting-started">Rust, Getting Started</a> (87 members) - Tiel</p>
</li>
<li>
<p><a href="https://www.meetup.com/dutch-rust-meetup/">Dutch Rust Meetup</a> (74 members) - Enschede</p>
</li>
</ul>
<h2 class="title is-4">New Zealand</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Wellington-Rust-Meetup/">Rust Wellington</a> (304 members) - Wellington</p>
</li>
<li>
<p><a href="https://www.meetup.com/christchurch-rustlang-meetup-group/">Christchurch Rust Meetup Group</a> (179 members) - Christchurch</p>
</li>
</ul>
<h2 class="title is-4">Nigeria</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-meetup-group/">Rust Nigeria</a> (448 members) - Lagos</p>
</li>
</ul>
<h2 class="title is-4">Norway</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Oslo/">Rust Oslo</a> (1,059 members) - Oslo</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-trondheim/">Rust Trondheim</a> (143 members) - Trondheim</p>
</li>
</ul>
<h2 class="title is-4">Peru</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/peru-rust-user-group/">Perú Rust User Group</a> (58 members) - Lima</p>
</li>
</ul>
<h2 class="title is-4">Poland</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-wroclaw">Rust Wroclaw</a> (887 members) - Wroclaw</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Warsaw/">Rust Warsaw</a> (668 members) - Warsaw</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-gdansk/">Rust Gdansk</a> (271 members) - Gdansk</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-poland-meetup/">Rust Poland</a> (17 members) - Poznan</p>
</li>
</ul>
<h2 class="title is-4">Russia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-%D0%B2-%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B5/">Rust Moscow</a> (1,519 members) - Moscow</p>
</li>
</ul>
<h2 class="title is-4">Serbia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/belgrade-rust-meetup-group">Belgrade Rust Meetup Froup</a> (140 members) - Belgrade</p>
</li>
</ul>
<h2 class="title is-4">Singapore</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-singapore">Rust Singapore</a> (309 members) - Singapore</p>
</li>
</ul>
<h2 class="title is-4">Slovakia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/bratislava-rust-meetup-group">Bratislava Rust Meetup Group</a> (191 members) - Bratislava</p>
</li>
</ul>
<h2 class="title is-4">South Africa</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/johannesburg-rust-meetup">Johannesburg Rust Meetup</a> (953 members) - Johannesburg</p>
</li>
</ul>
<h2 class="title is-4">South Korea</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Seoul/">Rust Seoul</a> (70 members) - Seoul</p>
</li>
</ul>
<h2 class="title is-4">Spain</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/bcnrust/">BcnRust</a> (890 members) - Barcelona</p>
</li>
<li>
<p><a href="https://www.meetup.com/MadRust/">MadRust</a> (597 members) - Madrid</p>
</li>
</ul>
<h2 class="title is-4">Sweden</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/stockholm-rust/">Stockholm Rust</a> (1,043 members) - Stockholm</p>
</li>
<li>
<p><a href="https://www.meetup.com/ruststhlm/">Rust Sthlm</a> (673 members) - Stockholm</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustgbg">Rust Göteborg</a> (489 members) - Göteborg</p>
</li>
</ul>
<h2 class="title is-4">Switzerland</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-zurich/">Rust Zurich</a> (1,141 members) - Zürich</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-basel/">Rust Basel</a> (303 members) - Basel</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-bern/">Rust Bern</a> (269 members) - Bern</p>
</li>
</ul>
<h2 class="title is-4">Taiwan</h2>
<ul>
<li>
<p><a href="https://github.com/rust-tw/meetup">Rust Taiwan Community</a> (61 members) - Taipei</p>
</li>
</ul>
<h2 class="title is-4">USA</h2>
<h3 class="title is-5">AZ</h3>
<ul>
<li><a href="https://www.meetup.com/Desert-Rustaceans/">Desert Rust</a> (301 members) - Phoenix</li>
</ul>
<h3 class="title is-5">CA</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-Bay-Area/">Rust Bay Area</a> (2,932 members) - San Francisco</li>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/">San Francisco Rust Study Group</a> (601 members) - San Francisco</li>
<li><a href="https://www.meetup.com/Rust-Los-Angeles/">Rust Los Angeles</a> (546 members) - Los Angeles</li>
<li><a href="https://www.meetup.com/San-Diego-Rust/">San Diego Rust</a> (493 members) - San Diego</li>
<li><a href="https://www.meetup.com/mv-rust-meetup/">Mountain View  Rust Meetup</a> (257 members) - Mountain View</li>
<li><a href="https://www.meetup.com/thursday-go/">Pasadena Thursday Go / Rust</a> (165 members) - Pasadena</li>
<li><a href="https://www.meetup.com/rust-breakfast-learn">Rust Silicon Valley Community</a> (135 members) - San Jose</li>
</ul>
<h3 class="title is-5">CO</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-Boulder-Denver/">Rust Denver</a> (860 members) - Denver</li>
<li><a href="https://www.meetup.com/boulder-rust-meetup/">Boulder Rust Meetup</a> (169 members) - Boulder</li>
</ul>
<h3 class="title is-5">DC</h3>
<ul>
<li><a href="https://www.meetup.com/RustDC/">Rust DC</a> (979 members) - Washington</li>
</ul>
<h3 class="title is-5">GA</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-ATL/">Rust Atlanta</a> (377 members) - Atlanta</li>
</ul>
<h3 class="title is-5">IL</h3>
<ul>
<li><a href="https://www.meetup.com/Chicago-Rust-Meetup/">Chicago Rust Meetup</a> (509 members) - Chicago</li>
</ul>
<h3 class="title is-5">IN</h3>
<ul>
<li><a href="https://www.meetup.com/indyrs/">Indy Rust</a> (403 members) - Indianapolis</li>
</ul>
<h3 class="title is-5">MA</h3>
<ul>
<li><a href="https://www.meetup.com/bostonrust/">Boston Rust Meetup</a> (1,321 members) - Boston</li>
</ul>
<h3 class="title is-5">MI</h3>
<ul>
<li><a href="https://www.meetup.com/detroitrust/">Detroit Rust</a> (187 members) - Detroit</li>
</ul>
<h3 class="title is-5">MN</h3>
<ul>
<li><a href="https://www.meetup.com/minneapolis-rust-meetup/">Minneapolis Rust Meetup</a> (542 members) - Minneapolis</li>
</ul>
<h3 class="title is-5">MO</h3>
<ul>
<li><a href="https://www.meetup.com/stl-rust/events/">STL Rust</a> (335 members) - Saint Louis</li>
</ul>
<h3 class="title is-5">NY</h3>
<ul>
<li><a href="https://www.meetup.com/rust-nyc/">Rust NYC</a> (<a href="https://rust.nyc/">web</a>) (3,523 members) - New York</li>
<li><a href="https://www.meetup.com/buffalo-rust-meetup/">Buffalo Rust Meetup</a> (475 members) - Buffalo</li>
</ul>
<h3 class="title is-5">OH</h3>
<ul>
<li><a href="https://www.meetup.com/columbus-rs/">Columbus Rust Society</a> (559 members) - Columbus</li>
</ul>
<h3 class="title is-5">OR</h3>
<ul>
<li><a href="https://www.meetup.com/PDXRust/">PDXRust</a> (826 members) - Portland</li>
</ul>
<h3 class="title is-5">TX</h3>
<ul>
<li><a href="https://www.meetup.com/dallasrust/">Dallas Rust User Meetup</a> (937 members) - Dallas</li>
<li><a href="https://www.meetup.com/rust-atx/">Rust ATX</a> (674 members) - Austin</li>
</ul>
<h3 class="title is-5">UT</h3>
<ul>
<li><a href="https://www.meetup.com/utah-rust/">Utah Rust</a> (567 members) - Lehi</li>
</ul>
<h3 class="title is-5">VA</h3>
<ul>
<li><a href="https://www.meetup.com/charlottesville-rust-meetup/">Charlottesville Rust Meetup</a> (584 members) - Charlottesville</li>
</ul>
<h3 class="title is-5">WA</h3>
<ul>
<li>
<p><a href="https://www.meetup.com/seattle-rust-user-group/">Seattle Rust User Group</a> (1,939 members) - Seattle</p>
</li>
<li>
<p><a href="https://www.meetup.com/spokane-rust/">Spokane</a> (78 members) - Spokane</p>
</li>
</ul>
<h2 class="title is-4">Uganda</h2>
<ul>
<li>
<p><a href="https://www.eventbrite.com/o/rust-circle-kampala-65249289033">Rust Circle Kampala</a> (53 members) - Online</p>
</li>
</ul>
<h2 class="title is-4">United Kingdom</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-london-user-group/">Rust London User Group</a> (3,493 members) - London, 17</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff/">Rust and C++ Cardiff</a> (1,147 members) - Cardiff</p>
</li>
<li>
<p><a href="https://www.meetup.com/Cambridge-Rust-Meetup/">Cambridge Rust meetup</a> (491 members) - Cambridge, C3</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-edi">Rust and Friends</a> (457 members) - Edinburgh</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-manchester">Rust Manchester</a> (415 members) - Manchester</p>
</li>
<li>
<p><a href="https://www.meetup.com/women-in-rust/">Women in Rust</a> (285 members) - London</p>
</li>
<li>
<p><a href="https://www.meetup.com/oxford-rust-meetup-group/">Oxford Rust Meetup Group</a> (262 members) - Oxford, K2</p>
</li>
<li>
<p><a href="https://www.meetup.com/reading-rust-workshop">Reading Rust Workshop</a> (200 members) - Reading</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Belfast-Meetup/">Rust Belfast Meetup</a> (127 members) - Belfast, R3</p>
</li>
</ul>
<h2 class="title is-4">Uruguay</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Uruguay/">Rust Meetup Uruguay</a> (453 members) - Montevideo</p>
</li>
</ul>
<h2 class="title is-4">Worldwide</h2>
<ul>
<li>
<p><a href="https://rustlang-es.org">RustLang en Español</a> (2,305 members) - Online</p>
</li>
</ul>
<p>For this page even the Markdown file is generated. See the <code>preprocessing</code> in the <a href="https://github.com/szabgab/rust.code-maven.com/">repository</a> and the <code>examples/meetups.yaml</code> file.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust social status update 2025.06</title>
    <summary type="html"><![CDATA[How many member do various Rust social groups have?]]></summary>
    <updated>2025-06-17T20:30:01Z</updated>
    <pubDate>2025-06-17T20:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-update-2025-06-17" />
    <id>https://rust.code-maven.com/rust-update-2025-06-17</id>
    <content type="html"><![CDATA[<p>While the technical capabilities of a programming language are very important, the social acceptance of the language also has a huge
impact on the ecosystem around the language.</p>
<p>It is also a good (or at least reasonable) measurement of the popularity of the language.</p>
<p>The <a href="/user-groups">Rust user groups</a> page was updated exactly 6 months ago so today, December 17 is the day I share the new report.</p>
<ul>
<li>The <a href="/rust-update-2024-12-17">report on 2024.12.17</a>.</li>
<li>The <a href="/rust-update-2024-06-17">report on 2024.06.17</a>.</li>
</ul>
<h2 class="title is-4">Rust User Groups</h2>
<p>There are mostly Meetup groups in <a href="/user-groups">the list</a>, though some use different platforms. In some cases the number of members cannot be determined.</p>
<p>Overall:</p>
<table>
<thead>
<tr>
<th>date</th>
<th>no. groups</th>
<th>members</th>
<th>change</th>
</tr>
</thead>
<tbody>
<tr>
<td>2023.12.11</td>
<td>99</td>
<td>59,629</td>
<td></td>
</tr>
<tr>
<td>2024.03.17</td>
<td>113</td>
<td>65,200</td>
<td>5,571</td>
</tr>
<tr>
<td>2024.06.17</td>
<td>116</td>
<td>68,126</td>
<td>2,926</td>
</tr>
<tr>
<td>2024.12.17</td>
<td>132</td>
<td>77,688</td>
<td>9,562</td>
</tr>
<tr>
<td>2025.06.17</td>
<td>120</td>
<td>79,588</td>
<td>1,900</td>
</tr>
</tbody>
</table>
<p>In the last 6 months several groups closed down. Probably due to the price-hike of Meetup (the new price is 3 times of the old one). Some might use another platform, but I don't know where.
If you do, please let me know!</p>
<p>These are the groups that were closed:</p>
<ul>
<li>Rust Chennai in Chennai, India. 1,204</li>
<li>Rust AKL in Auckland, New Zealand. 672</li>
<li>Finland Rust-lang Group in Helsinki, Finland. 602</li>
<li>Rust-Saar in Saarbrücken, Germany. 425</li>
<li>Rust Chinese Community in Beijing, China. 163</li>
<li>Ottawa Rust Language Meetup in Ottawa, ON, Canada. 154</li>
<li>Hack-away with Rust in Espoo, Finland. 125</li>
<li>RustSchool Rotterdam in Rotterdam, Netherlands. 104</li>
<li>Rust Bordeaux in Bordeaux, France. 95</li>
<li>Rust Triangle in Durham, NC, USA. 89</li>
<li>Rust Bristol in Bristol, United Kingdom. 86</li>
<li>Orange County Rust in Irvine, CA, USA. 72</li>
<li>TOTAL: 3791</li>
</ul>
<p>the number of members grew only by 2%, but 3,791 were in the closed groups. If we only count the groups that remained open then the growth is 7%. Less than in the previous 6 months, but still impressive.</p>
<ul>
<li>In the previous 6 months the number of members grew by 14%. Thats over 30% annually.</li>
<li>In the 3 months before that the growth was 4.4% or roughly 20% annually.</li>
</ul>
<p>The three largest Rust groups are:</p>
<ul>
<li><a href="https://www.meetup.com/rust-nyc/">Rust NYC</a> (3,523 members. It had 3,192)</li>
<li><a href="https://www.meetup.com/rust-london-user-group/">Rust London User Group</a> (3,493 members. It had 3,357)</li>
<li><a href="https://www.meetup.com/rust-berlin/">Rust Berlin</a> (4,435 members. It had 3,123).</li>
</ul>
<p>These are also the only groups with more than 3,000 members.</p>
<p>My <a href="https://www.meetup.com/code-mavens/"><strong>Code-Mavens</strong></a> group has 3,841 members (up from 3,213). I use it to organize virtual events in English about Rust, Python, and Perl.
I did not include it in the list.</p>
<p>The <a href="https://www.meetup.com/rust-tlv/">Rust Tel Aviv</a> group that I organize has 1,343 members (up from 1,011 6 months ago and up from 950 members from when I inherited it).</p>
<p>For full details, see of <a href="/user-groups">Rust User Groups</a>.</p>
<p>I updated the figures in several commit that will allow someone to check the changes more easily. Here are the commits.</p>
<table>
<thead>
<tr>
<th>action</th>
<th>no. groups</th>
<th>members</th>
<th>commit</th>
</tr>
</thead>
<tbody>
<tr>
<td>Before</td>
<td>132</td>
<td>77,688</td>
<td></td>
</tr>
<tr>
<td>Update members</td>
<td>132</td>
<td>79,588</td>
<td><a href="https://github.com/szabgab/rust.code-maven.com/commit/5c0fe32e2af01d7b39c52ddcd1d106985596ed02">commit</a></td>
</tr>
<tr>
<td>Add group I did not know about earlier</td>
<td>120</td>
<td>79,588</td>
<td><a href="https://github.com/szabgab/rust.code-maven.com/commit/3bfae81a1c9e4a46fbe77434bac5c28d752805e8">commit</a></td>
</tr>
<tr>
<td>Sort groups</td>
<td>120</td>
<td>79,588</td>
<td><a href="https://github.com/szabgab/rust.code-maven.com/commit/d4258bba98b9aad3cff83d540799228f8e5b4279">commit</a></td>
</tr>
</tbody>
</table>
<h2 class="title is-4">Rust on LinkedIn</h2>
<table>
<thead>
<tr>
<th>group</th>
<th>2024.04.08</th>
<th>2024.06.17</th>
<th>change (2 months)</th>
<th>2024.12.17</th>
<th>change (6 month)</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.linkedin.com/groups/4973032/">Rust Programming Language</a></td>
<td>23,261</td>
<td>24,139</td>
<td>3.7 %</td>
<td>26,186</td>
<td>8.4%</td>
<td>27,539</td>
</tr>
<tr>
<td><a href="https://www.linkedin.com/groups/12537155/">Rust Developer Community (Rust Lang)</a></td>
<td>3,668</td>
<td>4,048</td>
<td>10.3 %</td>
<td>5,068</td>
<td>25.1%</td>
<td>6,202</td>
</tr>
<tr>
<td><a href="https://www.linkedin.com/groups/6931877/">Rust Developers</a></td>
<td>1,311</td>
<td>1,365</td>
<td>4.1 %</td>
<td>1,455</td>
<td>6.5%</td>
<td>1,538</td>
</tr>
<tr>
<td><a href="https://www.linkedin.com/groups/12566531/">Rust (Programming Language)</a></td>
<td>1,308</td>
<td>1,489</td>
<td>13.8 %</td>
<td>2,025</td>
<td>35.9%</td>
<td>2,509</td>
</tr>
</tbody>
</table>
<p><a href="/rust-on-linkedin">Rust on LinkedIn</a></p>
<h2 class="title is-4">Rust on Facebook</h2>
<table>
<thead>
<tr>
<th>Group</th>
<th>2024.04.08</th>
<th>2024.07.19</th>
<th>change</th>
<th>2024.12.17</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.facebook.com/groups/1412062792318164/">Rust Developers (inactive)</a></td>
<td>8.8K</td>
<td>9.0K</td>
<td>2.27%</td>
<td>9.5K</td>
<td>9.8 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/872919370237098/"><strong>Rust Programming Language</strong></a></td>
<td>3.0K</td>
<td>3.4K</td>
<td>13%</td>
<td>4.1K</td>
<td>4.7 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/rust.tw/">Rust-lang.tw</a></td>
<td>2.5K</td>
<td>2.6K</td>
<td>4%</td>
<td>2.7K</td>
<td>2.8 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/programming.rust/">Programming Rust</a></td>
<td>1.9K</td>
<td>2.0K</td>
<td>5%</td>
<td>2.3K</td>
<td>2.5 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/rustdevelopersvietnam/">Rust Developers Vietnam</a></td>
<td>1.8K</td>
<td>2.2K</td>
<td>22%</td>
<td>2.7K</td>
<td>2.9 K</td>
</tr>
</tbody>
</table>
<p>The first group listed is inactive, but still people become members.</p>
<p>Full report on <a href="/rust-on-facebook">Rust on Facebook</a></p>
<h2 class="title is-4">Rust on Reddit</h2>
<p>Subredit members</p>
<table>
<thead>
<tr>
<th>subredit</th>
<th>2024.04.08</th>
<th>2024.06.19</th>
<th>change (2 month)</th>
<th>2024.12.16</th>
<th>change (6 month)</th>
<th>2025.06.17</th>
<th>change</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.reddit.com/r/rust/">/r/rust</a></td>
<td>286K</td>
<td>297K</td>
<td>3.8%</td>
<td>325K</td>
<td>9.4%</td>
<td>351K</td>
<td>8%</td>
</tr>
<tr>
<td><a href="https://www.reddit.com/r/learnrust/">/r/learnrust</a></td>
<td>25K</td>
<td>27K</td>
<td>8%</td>
<td>32K</td>
<td>18.5%</td>
<td>38K</td>
<td>18.7%</td>
</tr>
<tr>
<td><a href="https://www.reddit.com/r/rust_gamedev/">/r/rust_gamedev</a></td>
<td>38K</td>
<td>38K</td>
<td></td>
<td>40K</td>
<td>5.2%</td>
<td>42K</td>
<td>5%</td>
</tr>
</tbody>
</table>
<p>All 3 groups grow nicely.</p>
<p>See <a href="/rust-on-reddit">Rust on Reddit</a></p>
<h2 class="title is-4">X Twitter</h2>
<p>Counting followers</p>
<table>
<thead>
<tr>
<th>account</th>
<th>2024.01.06</th>
<th>2024.06.19</th>
<th>2024.12.16</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://x.com/rustlang">Rustlang</a></td>
<td>136.9K</td>
<td>143.9K</td>
<td>148.9K</td>
<td>152.1K</td>
</tr>
<tr>
<td><a href="https://x.com/m_ou_se">Mara Bos</a></td>
<td>41.3K</td>
<td>43.3K</td>
<td>44.7K</td>
<td>45.2K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_foundation">rust_foundation</a></td>
<td>35.6K</td>
<td>37.7K</td>
<td>39.0K</td>
<td>39.8K</td>
</tr>
<tr>
<td><a href="https://x.com/RustTrending">RustTrending</a></td>
<td>29.5K</td>
<td>32.4K</td>
<td>34.8K</td>
<td>36.0K</td>
</tr>
<tr>
<td><a href="https://x.com/ThisWeekInRust">ThisWeekInRust</a></td>
<td>31.9K</td>
<td>32.3K</td>
<td>32.3K</td>
<td>32.4K</td>
</tr>
<tr>
<td><a href="https://x.com/rustconf">RustConf</a></td>
<td>15.3K</td>
<td>16.4K</td>
<td>17.4K</td>
<td>17.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_analyzer">rust_analyzer</a></td>
<td>13.5K</td>
<td>13.5K</td>
<td>13.1K</td>
<td>12.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rustembedded">rustembedded</a></td>
<td>11.2K</td>
<td>11.9K</td>
<td>12.3K</td>
<td>11.9K</td>
</tr>
<tr>
<td><a href="https://x.com/tokio_rs">tokio_rs</a></td>
<td>11.6K</td>
<td>11.8K</td>
<td>11.6K</td>
<td>11.3K</td>
</tr>
<tr>
<td><a href="https://x.com/SurrealDB">SurrealDB</a></td>
<td>7,498</td>
<td>8,345</td>
<td>8,524</td>
<td>8,718</td>
</tr>
<tr>
<td><a href="https://x.com/RustFest">RustFest</a></td>
<td>7,825</td>
<td>7,742</td>
<td>7,505</td>
<td>7,261</td>
</tr>
<tr>
<td><a href="https://x.com/rustjobs_dev">rustjobs_dev</a></td>
<td>4,499</td>
<td>5,568</td>
<td>6,035</td>
<td>6,491</td>
</tr>
<tr>
<td><a href="https://x.com/cratesiostatus">crates.io status</a></td>
<td>5.039</td>
<td>5,543</td>
<td>5,665</td>
<td>5,715</td>
</tr>
<tr>
<td><a href="https://x.com/AstraKernel">AstraKernel</a></td>
<td>1,925</td>
<td>3,611</td>
<td>4,436</td>
<td>5,300</td>
</tr>
<tr>
<td><a href="https://x.com/orhundev">Orhun Parmaksız</a></td>
<td></td>
<td>3,336</td>
<td>4,200</td>
<td>4,954</td>
</tr>
<tr>
<td><a href="https://x.com/rustlab_conf">rustlab_conf</a></td>
<td>3,816</td>
<td>4,163</td>
<td>4,674</td>
<td>4,721</td>
</tr>
<tr>
<td><a href="https://x.com/RustDiscussions">Rust Weekly</a></td>
<td>2,549</td>
<td>3,285</td>
<td>3,808</td>
<td>4,200</td>
</tr>
<tr>
<td><a href="https://x.com/RustSecurity">RustSecurity</a></td>
<td>3,964</td>
<td>4,611</td>
<td>3,885</td>
<td>3,774</td>
</tr>
<tr>
<td><a href="https://x.com/RustNationUK">RustNationUK</a></td>
<td>2,157</td>
<td>2,738</td>
<td>3,215</td>
<td>3,684</td>
</tr>
<tr>
<td><a href="https://x.com/letsgetrusty">letsgetrusty</a></td>
<td>1,418</td>
<td>2,387</td>
<td>3,029</td>
<td>3,286</td>
</tr>
<tr>
<td><a href="https://x.com/euro_rust">euro_rust</a></td>
<td>2,201</td>
<td>2,503</td>
<td>2,915</td>
<td>3,092</td>
</tr>
<tr>
<td><a href="https://x.com/rustoftheday">Daily Rust</a></td>
<td>482</td>
<td>1,513</td>
<td>1,806</td>
<td>3,020</td>
</tr>
<tr>
<td><a href="https://x.com/RustLondon_">RustLondon_</a></td>
<td>2,522</td>
<td>2,699</td>
<td>2,838</td>
<td>2,991</td>
</tr>
<tr>
<td><a href="https://x.com/imperioworld_">Guillaume Gomez</a></td>
<td></td>
<td></td>
<td></td>
<td>2,774</td>
</tr>
<tr>
<td><a href="https://x.com/ratatui_rs">ratatui_rs</a></td>
<td>79</td>
<td>839</td>
<td>1,586</td>
<td>2,195</td>
</tr>
<tr>
<td><a href="https://x.com/RustMaven"><strong>RustMaven</strong></a></td>
<td>1</td>
<td>48</td>
<td>31</td>
<td>40</td>
</tr>
</tbody>
</table>
<ul>
<li>
<p>Orhun Parmaksız is the maintainer of <a href="https://ratatui.rs/">Ratatui.rs</a>.</p>
</li>
<li>
<p>Guillaume Gomez, rustdoc team leader, <a href="https://rust-lang.github.io/mdBook/">mdbook</a> contributor, Rust Paris organizer.</p>
</li>
</ul>
<h2 class="title is-4">Instagram</h2>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>24</td>
<td>4,520</td>
<td>3</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,356</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>677</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>333</td>
<td>430</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>106</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>36</td>
<td>62</td>
<td>6</td>
</tr>
</tbody>
</table>
<p>See <a href="/rust-in-instagram">Rust on Instagram</a>.</p>
<h2 class="title is-4">Rust on Telegram</h2>
<p>There might be other groups, but I am not aware of them and I've just created the Rust Maven telegram group so let me put it here:</p>
<p>Number of members.</p>
<table>
<thead>
<tr>
<th>group</th>
<th>2024.06.19</th>
<th>2024.12.16</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://t.me/+5P2gCQIWFaBkYmI0">Rust Maven</a></td>
<td>0</td>
<td>16</td>
<td>17</td>
</tr>
</tbody>
</table>
<p>And you are invited to join!</p>
<p>If you know of other groups, let me know so I can list them here.</p>
<h2 class="title is-4">WhatsApp</h2>
<p>Are there any Rust groups on WhatsApp that you would like me to include in my report?</p>
<h2 class="title is-4">The popularity of Rust</h2>
<p>The <a href="https://survey.stackoverflow.co/2024/">Stack Overflow  survey 2024</a> indicates that Rust is the most admired language by a large gap at 82.2%  (the next is Elixir at 76.8%). That is a lot of people love Rust. However this gap was much bigger last year.</p>
<p>On the other hand it is only 6th most desired language with 28.7%. Ahead of it are SQL and HTML/CSS that are, well, different. Also TypeScript, Python, and JavaScript. As I understand this indicates how many job openings are.</p>
<p>In a nutshell, this seem to indicate that many people will want to use Rust, but the number of open positions are relatively low.</p>
<p>However, being on the 6th place is also extremely good.</p>
<p><a href="https://pypl.github.io/PYPL.html">PYPL -  PopularitY of Programming Language</a></p>
<p>Indicates that Rust is number 8 with 2.97% share and +0.4% trend (up from 9 with 2.66% share and +0.5% 1-year trend six month ago) (up from number 10  twelve months ago)</p>
<p>Python is number 1 with 30.63% share and 1.1% trend. (was 1 with 29.71% share and 1.5% 1-year trend six month ago)</p>
<p>C/C++ (bundled together) is number 4 with 7.02% with +0.7% trend (was number 4 with 7.06%  with 0.3% 1-year trend six month ago). (up from number 5 twelve months ago)</p>
<p><a href="https://www.tiobe.com/tiobe-index/">TIOBE</a></p>
<p>Rust is number 18 (dowm from 14 six month ago) (up from number 18 a year ago) with 1.29% ratings and +0.48% change.</p>
<p>Python is number 1 25.87% +10.48% (was 1 with 23.84% ratings and +9.98% change).</p>
<p>C++ is number 2 10.68%, +0.65%  (was 2 with 10.82% ratings and 0.81% change.)</p>
<p>C is number 9.47% +0.24% (was 4 with 9.10% ratings and -2.34% change.)</p>
<p>Java is number 4 8.84% +0.44% (was 3 with 9.72% ratings and 1.73% change).</p>
<p>Also on TIOBE:</p>
<ul>
<li>ADA jumped from 25 to 11 in 1 year</li>
<li>Perl jumped from 17 to 13 in 1 year</li>
<li>R jumped from 21 to 14 in 1 year</li>
</ul>
<p>Even if earlier you thought that TIOBE is real this can show you that it has some very serious flaws. I doubt ADA and R would jump that much in a year, but I know that nothing in the Perl world explains this surge in Perl. I think I can say that as I am the editor of the <a href="https://perlweekly.com/">Perl Weekly newsletter</a> so I think I have some undertanding about the popularity of Perl.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust on X Twitter</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-17T19:30:01Z</updated>
    <pubDate>2025-06-17T19:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-on-twitter" />
    <id>https://rust.code-maven.com/rust-on-twitter</id>
    <content type="html"><![CDATA[<p>Counting followers</p>
<table>
<thead>
<tr>
<th>account</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://x.com/rustlang">Rustlang</a></td>
<td>152.1K</td>
</tr>
<tr>
<td><a href="https://x.com/m_ou_se">Mara Bos</a></td>
<td>45.2K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_foundation">rust_foundation</a></td>
<td>39.8K</td>
</tr>
<tr>
<td><a href="https://x.com/RustTrending">RustTrending</a></td>
<td>36.0K</td>
</tr>
<tr>
<td><a href="https://x.com/ThisWeekInRust">ThisWeekInRust</a></td>
<td>32.4K</td>
</tr>
<tr>
<td><a href="https://x.com/rustconf">RustConf</a></td>
<td>17.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_analyzer">rust_analyzer</a></td>
<td>12.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rustembedded">rustembedded</a></td>
<td>11.9K</td>
</tr>
<tr>
<td><a href="https://x.com/tokio_rs">tokio_rs</a></td>
<td>11.3K</td>
</tr>
<tr>
<td><a href="https://x.com/SurrealDB">SurrealDB</a></td>
<td>8,718</td>
</tr>
<tr>
<td><a href="https://x.com/RustFest">RustFest</a></td>
<td>7,261</td>
</tr>
<tr>
<td><a href="https://x.com/rustjobs_dev">rustjobs_dev</a></td>
<td>6,491</td>
</tr>
<tr>
<td><a href="https://x.com/cratesiostatus">crates.io status</a></td>
<td>5,715</td>
</tr>
<tr>
<td><a href="https://x.com/AstraKernel">AstraKernel</a></td>
<td>5,300</td>
</tr>
<tr>
<td><a href="https://x.com/orhundev">Orhun Parmaksız</a></td>
<td>4,954</td>
</tr>
<tr>
<td><a href="https://x.com/rustlab_conf">rustlab_conf</a></td>
<td>4,721</td>
</tr>
<tr>
<td><a href="https://x.com/RustDiscussions">Rust Weekly</a></td>
<td>4,200</td>
</tr>
<tr>
<td><a href="https://x.com/RustSecurity">RustSecurity</a></td>
<td>3,774</td>
</tr>
<tr>
<td><a href="https://x.com/RustNationUK">RustNationUK</a></td>
<td>3,684</td>
</tr>
<tr>
<td><a href="https://x.com/letsgetrusty">letsgetrusty</a></td>
<td>3,286</td>
</tr>
<tr>
<td><a href="https://x.com/euro_rust">euro_rust</a></td>
<td>3,092</td>
</tr>
<tr>
<td><a href="https://x.com/rustoftheday">Daily Rust</a></td>
<td>3,020</td>
</tr>
<tr>
<td><a href="https://x.com/RustLondon_">RustLondon_</a></td>
<td>2,991</td>
</tr>
<tr>
<td><a href="https://x.com/imperioworld_">Guillaume Gomez</a></td>
<td>2,774</td>
</tr>
<tr>
<td><a href="https://x.com/ratatui_rs">ratatui_rs</a></td>
<td>2,195</td>
</tr>
<tr>
<td><a href="https://x.com/RustMaven"><strong>RustMaven</strong></a></td>
<td>40</td>
</tr>
</tbody>
</table>
<ul>
<li>
<p>Orhun Parmaksız is the maintainer of <a href="https://ratatui.rs/">Ratatui.rs</a>.</p>
</li>
<li>
<p>Guillaume Gomez, rustdoc team leader, <a href="https://rust-lang.github.io/mdBook/">mdbook</a> contributor, Rust Paris organizer.</p>
</li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust on Instagram</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-17T09:30:01Z</updated>
    <pubDate>2025-06-17T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-on-instagram" />
    <id>https://rust.code-maven.com/rust-on-instagram</id>
    <content type="html"><![CDATA[<p>2023.12.07</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>12</td>
<td>2,374</td>
<td>16</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,223</td>
<td>0</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>576</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>283</td>
<td>434</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>75</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>0</td>
<td>3</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>2024.06.19</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>21</td>
<td>2,709</td>
<td>5</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,245</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>624</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>330</td>
<td>434</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>93</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>34</td>
<td>64</td>
<td>6</td>
</tr>
</tbody>
</table>
<p>2024.12.16</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>24</td>
<td>4,203</td>
<td>3</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,273</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>652</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>335</td>
<td>432</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>100</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>36</td>
<td>59</td>
<td>6</td>
</tr>
</tbody>
</table>
<p>2025.06.17</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>24</td>
<td>4,520</td>
<td>3</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,356</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>677</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>333</td>
<td>430</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>106</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>36</td>
<td>62</td>
<td>6</td>
</tr>
</tbody>
</table>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust at Work - conversation with Herbert Wolverson of Ardan Labs &amp; LibreQoS</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-03T09:30:01Z</updated>
    <pubDate>2025-06-03T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-at-work-ardan-labs-libreqos" />
    <id>https://rust.code-maven.com/rust-at-work-ardan-labs-libreqos</id>
    <content type="html"><![CDATA[<p><a class="button is-primary" href="https://www.meetup.com/code-mavens/events/308234298/">register</a></p>
<ul>
<li>
<p>Guest: <a href="https://www.linkedin.com/in/herbert-wolverson-98523346/">Herbert Wolverson</a> Rust Trainer/Consultant at <a href="https://www.ardanlabs.com/">Ardan Labs</a> and Chief Product Officer at <a href="https://libreqos.io/">LibreQoS</a>.</p>
</li>
<li>
<p>Host: <a href="https://szabgab.com/">Gabor Szabo</a> Rust and Python trainer and consultant.</p>
</li>
<li>
<p>Language: English</p>
</li>
<li>
<p>Location: Zoom</p>
</li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

</feed>

