{
  "version": "https://jsonfeed.org/version/1",
  "title": "marcelo.txt",
  "home_page_url": "https://blog.marcelomaga.space",
  "feed_url": "https://blog.marcelomaga.space/tag-rust.json",
  "description": "Posts sobre software, sistemas e arquitetura.",
  "items": [
    {
      "id": "https://blog.marcelomaga.space/arrumando-a-casa.html",
      "url": "https://blog.marcelomaga.space/arrumando-a-casa.html",
      "title": "Arrumando a Casa",
      "content_html": "<p>Não, eu não quero ajudar você a organizar seu quarto!</p>\n<h1 id=\"introdução\">Introdução<a href=\"#introdução\" aria-label=\"Link to heading 'Introdução'\" data-heading-content=\"Introdução\" class=\"anchor\"></a></h1>\n<p>Bom, como eu avia dito no artigo anterior tava querendo fazer esse projetinho do grep do Rust e aplicar algumas melhorias nele, e acho que a primeira coisa que devemos fazer quando pensamos em fazer uma refatoração do nível que comentei no artigo anterior (que esta aqui ó: <a href=\"super-minigrep.html\" data-wikilink=\"true\">Super minigrep</a>) é uma organização clara e objetiva, para que assim novos desenvolvedores possam entrar no projeto, e não terem que lidar com arquivos enormes (na medida do possível)</p>\n<h1 id=\"código-atual\">Código atual<a href=\"#código-atual\" aria-label=\"Link to heading 'Código atual'\" data-heading-content=\"Código atual\" class=\"anchor\"></a></h1>\n<p>Deixei uma <a href=\"https://github.com/Marcelo-maga/super-minigrep/tree/feature/book_code\">Branch</a> criada dentro do repositório mas aqui esta uma fotografia digital do estado atual que quero dizer\n<figure><img src=\"midia/super-minigrep/%7B1%7D.png\" alt=\"Estrutura atual do repo\" /></figure></p>\n<p>Consegue ver?? como as pessoas vão conseguir trabalhar aqui?? me fala!!! não tem como, então vamos primeiro aplicar melhorias na organização do projeto para ai sim, aplicar melhorias verdadeiras.</p>\n<h1 id=\"arquivos-que-gritam-seus-nomes\">Arquivos que gritam seus nomes<a href=\"#arquivos-que-gritam-seus-nomes\" aria-label=\"Link to heading 'Arquivos que gritam seus nomes'\" data-heading-content=\"Arquivos que gritam seus nomes\" class=\"anchor\"></a></h1>\n<p>É ISSO QUE NOS QUEREMOS! ARQUIVOS QUE GRITEM SEUS NOMES, SEU CANTO DE GUERRA, PRONTOS PARA A BATALHA!</p>\n<p>Se você já leu o capitulo 2 de Clean Code (☝️🤓) sabe oque eu quero dizer aqui, os nomes devem revelar o seu proposito, e creio fielmente nisso, então vamos começar com isso antes de qualquer coisa, sem alterar profundamente o código, isso tem que ficar para depois, para facilitar as mentes mais lentas (eu) e criar até mesmo um histórico de alterações mais tangível e real.</p>\n<h2 id=\"config\">Config<a href=\"#config\" aria-label=\"Link to heading 'Config'\" data-heading-content=\"Config\" class=\"anchor\"></a></h2>\n<p>Então vamos começar com a configuração, ela é a nossa porta de entrada, crie um arquivo '<em>config.rs</em>' e remova toda a parte de configuração e parâmetros da nossa mini CLI de dentro do <em>lib.rs</em>, teremos algo assim (caso você não tenha ansiedade e já começou a implementar algo):</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>use</a-k> std<a-p>::</a-p>env<a-p>;</a-p>\n\n<a-k>pub</a-k> <a-k>struct</a-k> <a-t>Config</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-pr>query</a-pr><a-p>:</a-p> <a-t>String</a-t><a-p>,</a-p>\n    <a-k>pub</a-k> <a-pr>filename</a-pr><a-p>:</a-p> <a-t>String</a-t><a-p>,</a-p>\n    <a-k>pub</a-k> <a-pr>case_sensitive</a-pr><a-p>:</a-p> <a-t>bool</a-t><a-p>,</a-p>\n<a-p>}</a-p>\n\n<a-k>impl</a-k> <a-t>Config</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>new</a-f><a-p>(</a-p><a-v>args</a-v><a-p>:</a-p> <a-o>&amp;</a-o><a-p>[</a-p><a-t>String</a-t><a-p>])</a-p> -&gt; <a-t>Result</a-t><a-p>&lt;</a-p><a-t>Config</a-t><a-p>,</a-p> <a-o>&amp;</a-o><a-t>str</a-t><a-p>&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> <a-k>mut</a-k> case_sensitive = <a-co>false</a-co><a-p>;</a-p>\n        <a-k>if</a-k> <a-p>(</a-p>args<a-p>.</a-p><a-f>len</a-f><a-p>()</a-p> == <a-co>4</a-co><a-p>)</a-p> &amp;&amp; <a-p>(</a-p>args<a-p>[</a-p><a-co>3</a-co><a-p>]</a-p> == <a-s>&quot;--case-sensitive&quot;</a-s><a-p>)</a-p> <a-p>{</a-p>\n            case_sensitive = <a-co>true</a-co><a-p>;</a-p>\n        <a-p>}</a-p>\n        <a-k>if</a-k> args<a-p>.</a-p><a-f>len</a-f><a-p>()</a-p> &lt; <a-co>3</a-co> <a-p>{</a-p>\n            <a-k>return</a-k> <a-f>Err</a-f><a-p>(</a-p><a-s>&quot;not enough arguments&quot;</a-s><a-p>);</a-p>\n        <a-p>}</a-p>\n\n        <a-k>let</a-k> query = args<a-p>[</a-p><a-co>1</a-co><a-p>].</a-p><a-f>clone</a-f><a-p>();</a-p>\n        <a-k>let</a-k> filename = args<a-p>[</a-p><a-co>2</a-co><a-p>].</a-p><a-f>clone</a-f><a-p>();</a-p>\n\n        <a-k>if</a-k> !case_sensitive <a-p>{</a-p>\n            case_sensitive = !env<a-p>::</a-p><a-f>var</a-f><a-p>(</a-p><a-s>&quot;CASE_SENSITIVE&quot;</a-s><a-p>).</a-p><a-f>is_err</a-f><a-p>();</a-p>\n        <a-p>}</a-p>\n\n        <a-f>Ok</a-f><a-p>(</a-p><a-t>Config</a-t> <a-p>{</a-p>\n            query<a-p>,</a-p>\n            filename<a-p>,</a-p>\n            case_sensitive<a-p>,</a-p>\n        <a-p>})</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<p>Com isso temos um arquivo com toda a regra de validação dos argumentos fornecidos pelo nosso usuário, etapa importante para nosso projetos, nossas ideias são enormes para esse projeto, uma CLI precisa de um bom parser de argumentos. (sim sim sim, eu sei que poderíamos estar utilizando <a href=\"https://crates.io/crates/clap\">Clap</a> para reduzir tudo isso em meras configurações triviais, mas para manter a magia da coisa, vamos manter dessa forma)</p>\n<h2 id=\"finder\">Finder<a href=\"#finder\" aria-label=\"Link to heading 'Finder'\" data-heading-content=\"Finder\" class=\"anchor\"></a></h2>\n<p>Sim, eu sei que sou péssimo com nomes (ficou claro com o nome desse projeto), mas acho que esse vai passar bem a vibes que desejamos aqui, um buscador, um achador (é isso ai, kkkk)</p>\n<p>Então já sabemos oque temos que fazer, crie um arquivo '<em>finder.rs</em>' e vamos encapsular as duas funções de busca que nos foram ensinadas dentro de um struct de mesmo nome, dessa forma nas nossas melhorias futuras tudo vai fazer sentido, tudo! se você tiver um pouco de conhecimento em Rust, deve ter chegado em algo parecido com isso:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>pub</a-k> <a-k>struct</a-k> <a-t>Finder</a-t><a-p>;</a-p>\n\n<a-k>impl</a-k> <a-t>Finder</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>search</a-f><a-p>&lt;</a-p><a-o>&#39;</a-o><a-l>a</a-l><a-p>&gt;(</a-p><a-v>query</a-v><a-p>:</a-p> <a-o>&amp;</a-o><a-t>str</a-t><a-p>,</a-p> <a-v>contents</a-v><a-p>:</a-p> <a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>)</a-p> -&gt; <a-t>Vec</a-t><a-p>&lt;</a-p><a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> <a-k>mut</a-k> result = <a-t>Vec</a-t><a-p>::</a-p><a-f>new</a-f><a-p>();</a-p>\n        <a-k>for</a-k> line <a-k>in</a-k> contents<a-p>.</a-p><a-f>lines</a-f><a-p>()</a-p> <a-p>{</a-p>\n            <a-k>if</a-k> line<a-p>.</a-p><a-f>contains</a-f><a-p>(</a-p>query<a-p>)</a-p> <a-p>{</a-p>\n                result<a-p>.</a-p><a-f>push</a-f><a-p>(</a-p>line<a-p>);</a-p>\n            <a-p>}</a-p>\n        <a-p>}</a-p>\n        result\n    <a-p>}</a-p>\n\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>search_case_insensitive</a-f><a-p>&lt;</a-p><a-o>&#39;</a-o><a-l>a</a-l><a-p>&gt;(</a-p><a-v>query</a-v><a-p>:</a-p> <a-o>&amp;</a-o><a-t>str</a-t><a-p>,</a-p> <a-v>contents</a-v><a-p>:</a-p> <a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>)</a-p> -&gt; <a-t>Vec</a-t><a-p>&lt;</a-p><a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> <a-k>mut</a-k> result = <a-t>Vec</a-t><a-p>::</a-p><a-f>new</a-f><a-p>();</a-p>\n        <a-k>for</a-k> line <a-k>in</a-k> contents<a-p>.</a-p><a-f>lines</a-f><a-p>()</a-p> <a-p>{</a-p>\n            <a-k>if</a-k> line<a-p>.</a-p><a-f>to_lowercase</a-f><a-p>().</a-p><a-f>contains</a-f><a-p>(</a-p><a-o>&amp;</a-o>query<a-p>.</a-p><a-f>to_lowercase</a-f><a-p>())</a-p> <a-p>{</a-p>\n                result<a-p>.</a-p><a-f>push</a-f><a-p>(</a-p>line<a-p>);</a-p>\n            <a-p>}</a-p>\n        <a-p>}</a-p>\n        result\n    <a-p>}</a-p>\n<a-p>}</a-p>\n\n<a-at>#</a-at><a-p>[</a-p><a-at>cfg</a-at><a-p>(</a-p><a-at>test</a-at><a-p>)]</a-p>\n<a-k>mod</a-k> tests <a-p>{</a-p>\n    <a-k>use</a-k> <a-k>super</a-k><a-p>::</a-p><a-o>*</a-o><a-p>;</a-p>\n\n    <a-at>#</a-at><a-p>[</a-p><a-at>test</a-at><a-p>]</a-p>\n    <a-k>fn</a-k> <a-f>case_sensitive</a-f><a-p>()</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> query = <a-s>&quot;duct&quot;</a-s><a-p>;</a-p>\n        <a-k>let</a-k> contents = <a-s>&quot;\\\nRust:\nsafe, fast, productive.\nPick three.\nDuct Tape.&quot;</a-s><a-p>;</a-p>\n        <a-m>assert_eq!</a-m><a-p>(</a-p>\n            <a-m>vec!</a-m><a-p>[</a-p><a-s>&quot;safe, fast, productive.&quot;</a-s><a-p>],</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search</a-f><a-p>(</a-p>query<a-p>,</a-p> contents<a-p>)</a-p>\n        <a-p>);</a-p>\n    <a-p>}</a-p>\n\n    <a-at>#</a-at><a-p>[</a-p><a-at>test</a-at><a-p>]</a-p>\n    <a-k>fn</a-k> <a-f>case_insensitive</a-f><a-p>()</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> query = <a-s>&quot;rUsT&quot;</a-s><a-p>;</a-p>\n        <a-k>let</a-k> contents = <a-s>&quot;\\\nRust:\nsafe, fast, productive.\nPick three.\nTrust me.&quot;</a-s><a-p>;</a-p>\n        <a-m>assert_eq!</a-m><a-p>(</a-p>\n            <a-m>vec!</a-m><a-p>[</a-p><a-s>&quot;Rust:&quot;</a-s><a-p>,</a-p> <a-s>&quot;Trust me.&quot;</a-s><a-p>],</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search_case_insensitive</a-f><a-p>(</a-p>query<a-p>,</a-p> contents<a-p>)</a-p>\n        <a-p>);</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<p>Nossos amigos do livro já deixaram testes feitos, lembra deles? pois então, em Rust deixamos os testes unitários dentro dos próprios arquivos, la em baixo, pode copiar e adaptar pra funcionar com suas próprias structs.</p>\n<h2 id=\"lib\">Lib<a href=\"#lib\" aria-label=\"Link to heading 'Lib'\" data-heading-content=\"Lib\" class=\"anchor\"></a></h2>\n<p>Bom se tudo deu certo ai, vamos precisar arrumar aqui também, o coração da CLI vive aqui, onde vamos expor nossas regras de negocio para que seja usavel pelo programa compilado, eu criei um struct chamada <em>SuperMiniGrep</em> dentro de '<em>lib.rs</em>' e joguei a função <em>run</em> dentro dela e arrumei os imports e tudo mais, ficou assim:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>pub</a-k> <a-k>mod</a-k> config<a-p>;</a-p>\n<a-k>mod</a-k> finder<a-p>;</a-p>\n\n<a-k>use</a-k> <a-k>crate</a-k><a-p>::</a-p>config<a-p>::</a-p><a-cr>Config</a-cr><a-p>;</a-p>\n<a-k>use</a-k> <a-k>crate</a-k><a-p>::</a-p>finder<a-p>::</a-p><a-cr>Finder</a-cr><a-p>;</a-p>\n<a-k>use</a-k> std<a-p>::</a-p>error<a-p>::</a-p><a-cr>Error</a-cr><a-p>;</a-p>\n<a-k>use</a-k> std<a-p>::</a-p>fs<a-p>;</a-p>\n\n<a-k>pub</a-k> <a-k>struct</a-k> <a-t>SuperMiniGrep</a-t><a-p>;</a-p>\n\n<a-k>impl</a-k> <a-t>SuperMiniGrep</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>run</a-f><a-p>(</a-p><a-v>config</a-v><a-p>:</a-p> <a-t>Config</a-t><a-p>)</a-p> -&gt; <a-t>Result</a-t><a-p>&lt;(),</a-p> <a-t>Box</a-t><a-p>&lt;</a-p><a-k>dyn</a-k> <a-t>Error</a-t><a-p>&gt;&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> contents = fs<a-p>::</a-p><a-f>read_to_string</a-f><a-p>(</a-p>config<a-p>.</a-p><a-pr>filename</a-pr><a-p>)</a-p>?<a-p>;</a-p>\n\n        <a-k>let</a-k> result = <a-k>if</a-k> config<a-p>.</a-p><a-pr>case_sensitive</a-pr> <a-p>{</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search</a-f><a-p>(</a-p><a-o>&amp;</a-o>config<a-p>.</a-p><a-pr>query</a-pr><a-p>,</a-p> <a-o>&amp;</a-o>contents<a-p>)</a-p>\n        <a-p>}</a-p> <a-k>else</a-k> <a-p>{</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search_case_insensitive</a-f><a-p>(</a-p><a-o>&amp;</a-o>config<a-p>.</a-p><a-pr>query</a-pr><a-p>,</a-p> <a-o>&amp;</a-o>contents<a-p>)</a-p>\n        <a-p>};</a-p>\n        <a-k>for</a-k> line <a-k>in</a-k> result <a-p>{</a-p>\n            <a-m>println!</a-m><a-p>(</a-p><a-s>&quot;{}&quot;</a-s><a-p>,</a-p> line<a-p>);</a-p>\n        <a-p>}</a-p>\n\n        <a-f>Ok</a-f><a-p>(())</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<p>Com tudo isso feito, nossa cli já deve compilar, mas primeiros vamos rodar os testes e ver se ta tudo passando né:</p>\n<p><figure><img src=\"midia/super-minigrep/%7B2%7D.png\" alt=\"Testes passando tudo OK\" /></figure></p>\n<p>Tudo certo, nossas alterações não quebraram a CLI no meio, um grande avanço para nós não acha?</p>\n<p>e com tudo isso nossa <em>main.rs</em> fica muito parecida, quase que intocada, porem os benefícios vão ser visíveis a longo prazo!</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>use</a-k> std<a-p>::</a-p>env<a-p>;</a-p>\n<a-k>use</a-k> std<a-p>::</a-p>process<a-p>;</a-p>\n\n<a-k>use</a-k> super_minigrep<a-p>::{</a-p><a-cr>SuperMiniGrep</a-cr><a-p>,</a-p> config<a-p>::</a-p><a-cr>Config</a-cr><a-p>};</a-p>\n\n<a-k>fn</a-k> <a-f>main</a-f><a-p>()</a-p> <a-p>{</a-p>\n    <a-k>let</a-k> args<a-p>:</a-p> <a-t>Vec</a-t><a-p>&lt;</a-p><a-t>String</a-t><a-p>&gt;</a-p> = env<a-p>::</a-p><a-f>args</a-f><a-p>().</a-p><a-f>collect</a-f><a-p>();</a-p>\n\n    <a-k>let</a-k> config = <a-t>Config</a-t><a-p>::</a-p><a-f>new</a-f><a-p>(</a-p><a-o>&amp;</a-o>args<a-p>).</a-p><a-f>unwrap_or_else</a-f><a-p>(</a-p>|err| <a-p>{</a-p>\n        <a-m>eprintln!</a-m><a-p>(</a-p><a-s>&quot;Problem parsing arguments: {}&quot;</a-s><a-p>,</a-p> err<a-p>);</a-p>\n        process<a-p>::</a-p><a-f>exit</a-f><a-p>(</a-p><a-co>1</a-co><a-p>);</a-p>\n    <a-p>});</a-p>\n\n    <a-k>if</a-k> <a-k>let</a-k> <a-cr>Err</a-cr><a-p>(</a-p>e<a-p>)</a-p> = <a-t>SuperMiniGrep</a-t><a-p>::</a-p><a-f>run</a-f><a-p>(</a-p>config<a-p>)</a-p> <a-p>{</a-p>\n        <a-m>eprintln!</a-m><a-p>(</a-p><a-s>&quot;Application error: {}&quot;</a-s><a-p>,</a-p> e<a-p>);</a-p>\n        process<a-p>::</a-p><a-f>exit</a-f><a-p>(</a-p><a-co>1</a-co><a-p>);</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<h1 id=\"conclusão\">Conclusão<a href=\"#conclusão\" aria-label=\"Link to heading 'Conclusão'\" data-heading-content=\"Conclusão\" class=\"anchor\"></a></h1>\n<p>Bom isso aqui ficou maior do que eu esperava, sei que prometi no artigo anterior já fazer melhorias no código em si, mas acho que foi um passo importante para o soberania do super-minigrep.</p>\n<p>e foi assim que ficou a estrutura do projeto, podemos fazer muitas outras melhorias, mas com o tempo se tudo ir se encaminhando bem, vamos aplicando elas (como o Cargo Workspaces)</p>\n<p><figure><img src=\"midia/super-minigrep/%7B3%7D.png\" alt=\"Estrutura Final\" /></figure></p>\n<p>Então aqui dou um tchau, beijos!</p>\n",
      "summary": "",
      "date_published": "2026-05-30T00:00:00-00:00",
      "image": "midia/super-minigrep/%7B1%7D.png",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "rust"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/super-minigrep.html",
      "url": "https://blog.marcelomaga.space/super-minigrep.html",
      "title": "Super minigrep",
      "content_html": "<p>Eitchaa 2 posts em uma semana, sou uma maquina...</p>\n<h1 id=\"pq-estamos-aqui\">Pq estamos aqui?<a href=\"#pq-estamos-aqui\" aria-label=\"Link to heading 'Pq estamos aqui?'\" data-heading-content=\"Pq estamos aqui?\" class=\"anchor\"></a></h1>\n<p>Estava aqui agora 22:10 da noite pensando em como eu poderia aplicar tudo que eu andei falando/escrevendo aqui (<a href=\"cognitive-offloading.html\" data-wikilink=\"true\">Cognitive Offloading</a>) e tentando achar algo interessante que me desse a vontade necessária de construir fora do meu horário de trabalho. E ontem (20/05) e hoje (21/05) foram dias super produtivos lá, onde tive a oportunidade (rsrs) de construir basicamente um fazedor (isso ai que você leu!) de relatórios, onde basicamente, recebo as mensagens em uma fila RabbitMQ e crio o arquivo PDF, através de mágica e chromium, e envio o buffer para ser armazenado no sistema de arquivos da organização do usuário. O detalhe interessante disso tudo é que o worker que faz os PDF é escrito em uma beldade chamada <a href=\"https://rust-lang.org/\">Rust</a>.</p>\n<p>O que me acendeu uma vontade imensa de fazer alguma coisa minha aqui na minha casinha, mas tenho uma certa preguiça de desenvolver sistemas web quando o assunto é projetos pessoais, nunca gostei, sempre preferi criar aplicativos desktops</p>\n<p>(que inclusive penso em escrever um pouco sobre <a href=\"https://v2.tauri.app/\">Tauri</a> que bizzaramente tenho muita experiencia e historia pra contar do que eu já passei com esse framework maravilhoso)</p>\n<p>E outro mundo da programação que sempre adorei foram as CLI, e revisitando <a href=\"https://doc.rust-lang.org/book/\">O Livro</a> lembrei de um mini projeto que temos para aprender certos conceitos que aprendemos até aquele momento na leitura, o minigrep. O grep é um comando para pesquisar por padrões de texto em arquivos ou em qualquer coisa que tenha stdout no terminal, muito utilizado quando o desespero bate e voce esta dentro de um SSH com o seu chefe aos prantos por conta da API que caiu e você tem ideia de qual foi o console.log que foi adicionado no ultimo PR que travou o event loop do NodeJS.</p>\n<h1 id=\"a-ideia\">A ideia<a href=\"#a-ideia\" aria-label=\"Link to heading 'A ideia'\" data-heading-content=\"A ideia\" class=\"anchor\"></a></h1>\n<p>enfim, porque não melhorar ele??? então por aqui nas próximas semanas vão ser bem movimentado, a priore eu pensei em torno de 4 artigos seguindo uma completa refatoração do projeto minigrep para transforma ele em... (adivinha o nome super criativo) um super-minigrep.</p>\n<p>pensei em aceitar regex (o inferno nos aguarda), múltiplos arquivos sendo processados simultaneamente (Tokio vai ser necessário), um e error handling digno de cinema com anyhow e thiserror e maneiras pintar o terminal para ficar bem legal.</p>\n<p>Spolier: O primeiro artigo quero fazer uma analise (pouco aprofundada) do código que temos ao seguir o livro e já começar com pequenas melhorias!</p>\n<h1 id=\"conclusão\">Conclusão<a href=\"#conclusão\" aria-label=\"Link to heading 'Conclusão'\" data-heading-content=\"Conclusão\" class=\"anchor\"></a></h1>\n<p>Já deixei um repositório no <a href=\"https://github.com/Marcelo-maga/super-minigrep\">Github</a> pronto para começar</p>\n<p>conforme for criando os artigos vou usando esse aqui como um indexador para que seja facilmente localizado nesse mar de texto que vai virar isso aqui!!</p>\n<h2 id=\"sumario\">Sumario<a href=\"#sumario\" aria-label=\"Link to heading 'Sumario'\" data-heading-content=\"Sumario\" class=\"anchor\"></a></h2>\n<p>1 - <a href=\"arrumando-a-casa.html\" data-wikilink=\"true\">Arrumando a Casa</a></p>\n",
      "summary": "",
      "date_published": "2026-05-21T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "rust"
      ],
      "language": "pt-BR"
    }
  ]
}