<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt">
    <title>Blog do Bishonen - Postmortem</title>
    <subtitle>Mais um blog sobre desenvolvimento de software.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://bshn.rs/pt/categories/postmortem/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://bshn.rs"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-01-27T00:00:00+00:00</updated>
    <id>https://bshn.rs/pt/categories/postmortem/atom.xml</id>
    <entry xml:lang="pt">
        <title>Okxlivro - Post Mortem</title>
        <published>2025-01-27T00:00:00+00:00</published>
        <updated>2025-01-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            Nikita Bishonen
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://bshn.rs/pt/blog/2025-01-03-okxlivro-post-mortem/"/>
        <id>https://bshn.rs/pt/blog/2025-01-03-okxlivro-post-mortem/</id>
        
        <content type="html" xml:base="https://bshn.rs/pt/blog/2025-01-03-okxlivro-post-mortem/">&lt;p&gt;Olá! Hoje compartilho meus pensamentos sobre escrever bibliotecas Rust convenientes. Este é o primeiro post da série “Post Mortem”, onde farei uma análise técnica de diferentes projetos.&lt;&#x2F;p&gt;
&lt;p&gt;Hoje teremos no nosso crivo uma especificação técnica que me deram em uma empresa após uma entrevista. Não gosto de desperdiçar meu tempo pessoal, então geralmente recuso-me a passar por essa etapa, mas aqui o projeto parecia-me interessante e o completei. E também recebi uma recusa e feedback.&lt;&#x2F;p&gt;
&lt;p&gt;Vamos tentar corrigir o que desagradou ao revisor e, ao mesmo tempo, discutir as mudanças.&lt;&#x2F;p&gt;
&lt;p&gt;Como o anterior, este post começarei com uma pequena esclarecimento de conceitos. Se você tem certeza do seu conhecimento sobre a especificidade do comércio em bolsa, pule diretamente para a &lt;a href=&quot;https:&#x2F;&#x2F;bshn.rs&#x2F;pt&#x2F;blog&#x2F;2025-01-03-okxlivro-post-mortem&#x2F;#ess%C3%AAncia&quot;&gt;essência&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;portfolios-order-books-e-ordens&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#portfolios-order-books-e-ordens&quot; aria-label=&quot;Anchor link for: portfolios-order-books-e-ordens&quot;&gt;&lt;i class=&quot;icon&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt;
Portfólios, Order Books e Ordens&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Se você não está familiarizado com o comércio, recomendo ler antes um &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=Kl4-VJ2K8Ik&quot;&gt;pequeno vídeo sobre isso&lt;&#x2F;a&gt; ou uma &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Order_book&quot;&gt;artigo na Wikipédia&lt;&#x2F;a&gt;. A seguir, apresento minha compreensão do tema, que pode ser imprecisa ou incompleta.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Então, no Comércio temos:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Portfólio de Ordens
&lt;ul&gt;
&lt;li&gt;Ordens de Venda (Ask side Order)
&lt;ul&gt;
&lt;li&gt;Identificador do par de comércio (o que trocamos por quê), volume e preço&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Ordens de Compra (Bid side Order)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Obtém-se um livro de ordens ou order book onde registramos todas as ordens e se elas se cruzam (temos alguém querendo vender um ovo por um quilo de batata e outro querendo comprar um ovo por um quilo de batata),
podemos executar ambas as ordens.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;upload.wikimedia.org&#x2F;wikipedia&#x2F;commons&#x2F;thumb&#x2F;1&#x2F;14&#x2F;Order_book_depth_chart.gif&#x2F;250px-Order_book_depth_chart.gif&quot; alt=&quot;Order Book&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;essência&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#essência&quot; aria-label=&quot;Anchor link for: essência&quot;&gt;&lt;i class=&quot;icon&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt;
Essência&lt;&#x2F;h2&gt;
&lt;p&gt;Tentamos aplicar a &lt;a href=&quot;&#x2F;blog&#x2F;2024-12-13-rust-micro-structure&quot;&gt;Estrutura Baseada na Visibilidade dos Módulos&lt;&#x2F;a&gt;. A ideia e tarefa principal é escrever uma biblioteca para trabalhar com a exchange OKX, a API deve ser conveniente de usar e a implementação deve ser extensível e mantível.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Decidi tentar escrever código Rust idiomático, mas moderno - usando modelo assíncrono, tipagem estrita e ocultação de implementação.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Tudo aqui está bom, nenhum comentário foi identificado.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#&quot; aria-label=&quot;Anchor link for: &quot;&gt;&lt;i class=&quot;icon&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt;
REST (em paz =)&lt;&#x2F;h3&gt;
&lt;p&gt;Inicialmente fiz uma implementação bastante simples:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt; orderbook_snapshot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt;instrument_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; RestError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt; serde_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Client&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;format!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;MARKET_BOOKS_REST_URL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;?instId=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;instrument_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;&amp;amp;sz=5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; asks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EF9F76, #FF5C57);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;asks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;as_array&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;unwrap_or&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt;Order&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;try_from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;try_collect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; bids&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EF9F76, #FF5C57);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;bids&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;as_array&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;unwrap_or&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt;Order&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;try_from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;try_collect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;apply_snapshot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;SnapshotData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;asks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; bids&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt;    Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;E recebi um comentário - que a solução direta e o parsing de dados passa apenas por &lt;code&gt;Value&lt;&#x2F;code&gt;. Vamos reescrever isso para tipos estritos:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt; orderbook_snapshot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt;instrument_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt; client&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Client&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; RestError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt; inner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;ApiResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; client&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;format!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;MARKET_BOOKS_REST_URL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;?instId=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;instrument_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #CF9C00);&quot;&gt;&amp;amp;sz=5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#A6D189, #ADB1C2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; [&lt;&#x2F;span&gt;&lt;span&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; asks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;asks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt;Ask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; bids&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;bids&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt;Bid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;apply_snapshot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;SnapshotData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;asks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; bids&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt;    Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;orderbook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Os detalhes podem ser vistos no &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;personal1196&#x2F;trainings&#x2F;okxlivro&#x2F;-&#x2F;blob&#x2F;master&#x2F;src&#x2F;rest.rs&quot;&gt;git&lt;&#x2F;a&gt;, mas a própria implementação é quase padrão.
A diferença é que não faço desserialização direta em tipos públicos da biblioteca, mas uso &lt;code&gt;mod inner {...}&lt;&#x2F;code&gt;. Isso foi feito a partir de uma experiência baseada em medo de que:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;A exchange tem uma API instável, apesar da versionamento, descrição na documentação e realidade diferem, especialmente quando não há nenhum esquema formal;&lt;&#x2F;li&gt;
&lt;li&gt;A representação da exchange não é ótima, por exemplo, retorna um array de dados, mas o elemento é sempre um, ou os próprios lances e ofertas são um array de quatro elementos
um dos quais: &lt;code&gt;&quot;0&quot; é parte de um recurso descontinuado e sempre é &quot;0&quot;&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;-1&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#-1&quot; aria-label=&quot;Anchor link for: -1&quot;&gt;&lt;i class=&quot;icon&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt;
Asks &amp;amp; Bids&lt;&#x2F;h3&gt;
&lt;p&gt;Começarei com o simples, usamos todas as possibilidades da biblioteca padrão. Existe um requisito para listas de ordens, elas devem ser ordenadas do melhor para o pior.&lt;&#x2F;p&gt;
&lt;p&gt;Mas dependendo do lado da ordem (compramos&#x2F;vendemos), precisa-se ordenar por preço de forma crescente (melhor comprar mais barato) ou decrescente (melhor vender mais caro).&lt;&#x2F;p&gt;
&lt;p&gt;Inicialmente implementei-as dessa forma, onde a diferença de preços era no uso do envoltório &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;cmp&#x2F;struct.Reverse.html&quot;&gt;Reverse&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt; Mapa ordenado de Low to high price ([`Price`], [`Amount`]) de Asks.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; Asks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;BTreeMap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Price&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt; Mapa ordenado de High to low price ([`Price`], [`Amount`]) de Bids.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; Bids&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;BTreeMap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Reverse&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Price&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;O comentário indicava que seria inconveniente expandir e manter devido à duplicação de lógica na ausência de diferenças (apenas &lt;code&gt;Reverse&lt;&#x2F;code&gt;) entre lances e ofertas.&lt;&#x2F;p&gt;
&lt;p&gt;Me parece que o revisor queria algo diferente, mas decidi ir “all in” e, às vezes, duplicar a lógica, mas separar ofertas e lances ainda mais:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; AskPrice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Price&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; BidPrice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Reverse&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Price&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Criamos preços diferentes, bem como estruturas para lances e ofertas únicos, que usamos no módulo &lt;code&gt;realtime&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt; lib.rs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; Ask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span&gt; price&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; AskPrice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span&gt; amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; Bid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span&gt; price&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; BidPrice&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span&gt; amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);font-style: italic;&quot;&gt; realtime.rs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; SnapshotData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Ask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Bid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; UpdateData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Ask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Bid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Paro o comentário do revisor sobre “duplicação de lógica” afirmando que a lógica comum precisa ser implementada no nível &lt;code&gt;Price&lt;&#x2F;code&gt;,
e as diferenças de lógicas podem ser implementadas separadamente para &lt;code&gt;Bid&lt;&#x2F;code&gt; e &lt;code&gt;Ask&lt;&#x2F;code&gt;. E a presença de tipagem estrita no nível da API da biblioteca
fornece uma boa experiência de usuário, pois não será possível confundir acidentalmente um lance com uma oferta.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;-2&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#-2&quot; aria-label=&quot;Anchor link for: -2&quot;&gt;&lt;i class=&quot;icon&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt;
Stream&lt;&#x2F;h3&gt;
&lt;p&gt;Inicialmente usei a abordagem por canais de envio de mensagens, mas depois reescrevi para a opção mais ergonômica para usuários da biblioteca:
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;personal1196&#x2F;trainings&#x2F;okxlivro&#x2F;-&#x2F;merge_requests&#x2F;1&#x2F;diffs?diff_id=1224257646&amp;amp;start_sha=dcb0a49c106f39a254e06d2ebeabd912cc508cd0#76f9c51b493a7919f56a79c87fae8b40195e3848&quot;&gt;alterações&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt; orderbook_updates&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt;instrument_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Pin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Item&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;RealtimeData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; RealtimeError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;  Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;pin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;stream!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;    while&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;      ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;      yield&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;como vemos, esta abordagem ainda requer macros adicionais e iteradores assíncronos não são algo nativo da biblioteca padrão, continuamos esperando e esperando.&lt;&#x2F;p&gt;
&lt;p&gt;O comentário recebido aqui refere-se ao problema de gerenciamento de conexões:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt; orderbook_updates&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt;instrument_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Pin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Item&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;RealtimeData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; RealtimeError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;    ..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;    Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;pin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;stream!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;ws_stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt; tokio_tungstenite&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;connect_async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EF9F76, #2DAE58);&quot;&gt;WS_URL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span&gt; write&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ws_stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        write&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;message_string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;        while&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Era necessário extrair esta lógica do método, o que é muito lógico, amo o padrão quando todos os “recursos” são passados como argumentos do método,
nas formas mínimas necessárias. Isso certamente me fez sofrer um pouco com generics. Mas após dez minutos pulando pelo código
tungstenite encontrei os tipos corretos para erros e levei a assinatura do método para a seguinte forma, simultaneamente dividindo um método em dois:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt; subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;S&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt;channels_with_criterias&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;ChannelWithCriteria&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt; write&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; S&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; RealtimeError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt; transform_stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#EA999C, #565869);&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Pin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Item&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Item&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Também alterei o tipo retornado para suportar extensão para todos os tipos de dados possíveis para diferentes assinaturas:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; RealtimeData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;    Books&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;BooksChannelData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Posso dizer que enumerações em Rust são convenientes e práticas, o único que me falta muito - é que os variantes de enumerações têm suporte “de primeira classe” no sistema de tipos da linguagem.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; BooksChannelDelta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;    Snapshot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;SnapshotData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8CAAEE, #09A1ED);font-style: italic;&quot;&gt;    Update&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;UpdateData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; SnapshotData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Ask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Bid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; UpdateData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Ask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Bid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#99D1DB, #ADB1C2);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Por exemplo, a implementação de mensagens da exchange - por conexão WebSocket a nós pode ser entregue informação tanto sobre a atualização do portfólio quanto sobre um instantâneo do seu estado.
Se não usarmos uma enumeração, então os próprios dados são idênticos e o usuário pode confundi-los. Na implementação não apenas dividi-os em variantes,
mas também criei novos tipos envoltórios para maior segurança no uso.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;-3&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#-3&quot; aria-label=&quot;Anchor link for: -3&quot;&gt;&lt;i class=&quot;icon&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt;
Error&lt;&#x2F;h3&gt;
&lt;p&gt;Adoro uma biblioteca simples, mas extremamente útil &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;derive_more&#x2F;latest&#x2F;derive_more&#x2F;index.html&quot;&gt;derive_more&lt;&#x2F;a&gt; com macros procedurais para todos os casos de uso, por exemplo, para criar tipos de erros:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#C6D0F5, #565869); background-color: light-dark(#303446, #FAFBFC);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E5C890, #ADB1C2);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Display&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; From&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CA9EE6, #F767BB);&quot;&gt; enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #565869);font-style: italic;&quot;&gt; CompoundError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;    Realtime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; RealtimeError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt;    Rest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#81C8BE, #ADB1C2);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E5C890, #13BBB7);font-style: italic;&quot;&gt; RestError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#949CBB, #ADB1C2);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aqui, graças às macros, a enumeração torna-se um erro Rust, pode ser impressa como string e convertida de erros de nível inferior - tudo isso sem código extra
escrito manualmente. Ele existe - mas é gerado automaticamente.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;-4&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#-4&quot; aria-label=&quot;Anchor link for: -4&quot;&gt;&lt;i class=&quot;icon&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt;
Materiais Adicionais&lt;&#x2F;h2&gt;
&lt;p&gt;Se você estiver interessado em “jogar” com o exemplo deste artigo, aqui está o &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;personal1196&#x2F;trainings&#x2F;okxlivro&quot;&gt;código completo do projeto&lt;&#x2F;a&gt;.
Também ficarei grato por feedback, por favor escreva suas sugestões de melhoria do projeto nas issues do gitlab.&lt;&#x2F;p&gt;
&lt;p&gt;(End of file - total 228 lines)&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
