<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: vicmdv</title>
    <description>The latest articles on DEV Community by vicmdv (@vicmdv).</description>
    <link>https://dev.to/vicmdv</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F709070%2Ff0571683-fc87-46ed-b10e-8a3c84e3ca51.png</url>
      <title>DEV Community: vicmdv</title>
      <link>https://dev.to/vicmdv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vicmdv"/>
    <language>en</language>
    <item>
      <title>A cautionary tale on project-based-development</title>
      <dc:creator>vicmdv</dc:creator>
      <pubDate>Sat, 25 Nov 2023 19:41:17 +0000</pubDate>
      <link>https://dev.to/vicmdv/a-cautionary-tale-on-project-based-development-46cf</link>
      <guid>https://dev.to/vicmdv/a-cautionary-tale-on-project-based-development-46cf</guid>
      <description>&lt;p&gt;Hello! I'm Víctor &lt;em&gt;(aka Brian3647)&lt;/em&gt;, the author of &lt;a href="https://github.com/Brian3647/snowboard" rel="noopener noreferrer"&gt;snowboard&lt;/a&gt; (a http request parser &amp;amp; response generator) and &lt;a href="https://github.com/Brian3647?tab=repositories" rel="noopener noreferrer"&gt;a bunch of other things I might not want to talk about&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Learning a new programming language" isn't quite what you might want to do
&lt;/h2&gt;

&lt;p&gt;We have all, at least once, stumbled upon those 12-hour YouTube videos on how to learn a programming language like rust, javascript or python. Don't get me wrong, those are good, but they're definitely not for everyone. And by that, I mean only a small fraction of people actually learn to code. But first, we have to define that:&lt;/p&gt;

&lt;h3&gt;
  
  
  What is coding?
&lt;/h3&gt;

&lt;p&gt;Wikipedia might say something, and so will the dictionary, but I think coding might be as subjective as being good in a sport - sure, everyone can understand that a specific sequence of characters will print "hello, world!" to the terminal, but not many will even think about what are they actually doing.&lt;/p&gt;

&lt;p&gt;In my opinion, a good coder is not someone who knows data structures, file systems, algorithms or creates beautiful websites, but rather one that has a mind able to see a problem, relax for a bit, read something and find a solution for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because, face it, memorization isn't learning.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And neither is listening through 10 hours on how to make the compiler not cry and be able to copy code faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project-based development is scary
&lt;/h2&gt;

&lt;p&gt;Well, why not simply start with projects? Sounds good, doesn't it? Well, no. &lt;/p&gt;

&lt;p&gt;I mainly divide project-based-dev into 2 categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Big tutorials&lt;/li&gt;
&lt;li&gt;Documentation surfing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first one, big tutorials, are usually courses (often paid*) that teach you how to do a specific thing, usually something like a discord bot, a web application using react (use htmx instead) or something in the lines of an AI bot able to solve all your problems. Those are fun projects, yes, and once you start with them you feel unstoppable since everything works after a quick syntax error question in any forum, but trust me, they rarely help you.&lt;/p&gt;

&lt;p&gt;They mostly make you learn a 101 on how to get muted in any discord programming server, and if you manage to learn something, it will mostly be either too broad or too specific to actually help.&lt;/p&gt;

&lt;h3&gt;
  
  
  The dark corner of documentation surfing
&lt;/h3&gt;

&lt;p&gt;Thing is, even if you don't want to, you're going to have to learn how to search and read documentation earlier or later. And it can be ok &lt;em&gt;(if it isn't a npm package)&lt;/em&gt;. So being able to search information quickly and effectively is something that needs to be taught as soon as possible. You'll eventually find out that a good google search usually removes the wait time of asking to other people, and that most programming languages are at least a little bit readable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do your own thing
&lt;/h3&gt;

&lt;p&gt;It's ok, we're all out of good multimillionaire start-up ideas, but that definitely does not mean you should do another to-do app using 5GB worth of libraries. In fact, I've found out that most of the times, you're using a part of the library so small you might as well just write that part yourself, removing everything that you don't really use. This is extremely common when using a library that is basically a wrapper for another, where you're only using a tiny part of a tiny part of something.&lt;/p&gt;

&lt;p&gt;And when you have to go out of your way to do something that everyone is doing using another one's massive codebase, is where I found out you learn most of what you actually need.&lt;/p&gt;

&lt;p&gt;An example of this might be building static websites with something completely overkill for what you actually need instead of doing something as simple as a template replacement (eg. my own &lt;a href="https://github.com/Brian3647/encoped" rel="noopener noreferrer"&gt;encoped&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;After all, this is jut my opinion, and not only can but WILL be different for different people. That being said, if you do want to start building your own things, there's a bunch of things you can do.&lt;/p&gt;

&lt;p&gt;Do not be afraid to reinvent the wheel. Take your favorite programming language, build a JSON parser, call it super-fast, center the title in &lt;code&gt;README.md&lt;/code&gt; and patiently wait for the big total amount of 6 github stars in your project.&lt;/p&gt;

&lt;p&gt;Good luck!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ps: Q: does anyone know where to show people your work without getting destroyed? - A: nope&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>programming</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Snowboard v1.0.0 is here! 🏂🦀</title>
      <dc:creator>vicmdv</dc:creator>
      <pubDate>Wed, 22 Nov 2023 17:52:17 +0000</pubDate>
      <link>https://dev.to/vicmdv/snowboard-v100-is-here-14ce</link>
      <guid>https://dev.to/vicmdv/snowboard-v100-is-here-14ce</guid>
      <description>&lt;p&gt;I first talked online about snowboard &lt;a href="https://dev.to/brian3647/building-extremely-fast-apis-with-rust-snowboard-step-by-step-365g"&gt;here&lt;/a&gt;, and now, only 27 days after, snowboard 1.0.0 is available &amp;amp; production-ready!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is snowboard?
&lt;/h2&gt;

&lt;p&gt;Snowboard is a tool for creating extremely fast web servers in rust. It comes with its own request &amp;amp; url parser and a bunch of optional features like JSON/serde support, TLS security, WebSockets &amp;amp; asynchronous handlers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;

&lt;p&gt;You can install snowboard by adding it to your &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="py"&gt;snowboard&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and use it without any need of macro derives:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;snowboard&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;snowboard&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Result&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost:8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Listening on {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="nf"&gt;.pretty_addr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="nf"&gt;.run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="py"&gt;.method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nn"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nd"&gt;response!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method_not_allowed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Caught you trying to delete!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="nf"&gt;.set_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"X-Server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Snowboard"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{req:#?}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nd"&gt;response!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;headers!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"X-Hello"&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"World!"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;More info (&amp;amp; how to use async, tls, and other features) can be found &lt;a href="https://github.com/Brian3647/snowboard" rel="noopener noreferrer"&gt;in the readme&lt;/a&gt;. Happy coding!&lt;/p&gt;

&lt;p&gt;repo: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Brian3647" rel="noopener noreferrer"&gt;
        Brian3647
      &lt;/a&gt; / &lt;a href="https://github.com/Brian3647/snowboard" rel="noopener noreferrer"&gt;
        snowboard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      fast, simple &amp;amp; reliable http rust servers 🏂
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;strong&gt;Snowboard 🏂&lt;/strong&gt;&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b95ec0eaedea85bbd44cdd94887e445e5e547956636a1d8829e54d2b2ecda0ce/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f427269616e333634372f736e6f77626f617264"&gt;&lt;img src="https://camo.githubusercontent.com/b95ec0eaedea85bbd44cdd94887e445e5e547956636a1d8829e54d2b2ecda0ce/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f427269616e333634372f736e6f77626f617264" alt="License"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/19461440297574a2a282b8e0ba08e3e542daedff1d116590c010c65abcea8498/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f427269616e333634372f736e6f77626f6172642f727573742e796d6c"&gt;&lt;img src="https://camo.githubusercontent.com/19461440297574a2a282b8e0ba08e3e542daedff1d116590c010c65abcea8498/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f427269616e333634372f736e6f77626f6172642f727573742e796d6c" alt="Build status"&gt;&lt;/a&gt;
&lt;a href="https://app.deepsource.com/gh/Brian3647/snowboard/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ba960bb3b9c1ba68a24e89fee9314065ee81f01d23e41e7787552961aded7091/68747470733a2f2f6170702e64656570736f757263652e636f6d2f67682f427269616e333634372f736e6f77626f6172642e7376672f3f6c6162656c3d6163746976652b6973737565732673686f775f7472656e643d66616c7365" alt="DeepSource"&gt;&lt;/a&gt;
&lt;a href="https://deps.rs/repo/github/Brian3647/snowboard" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/90f900ae4e117bf1853511817f6abcccc99d023552f68d95ed3fe4c440f2e245/68747470733a2f2f646570732e72732f7265706f2f6769746875622f427269616e333634372f736e6f77626f6172642f7374617475732e737667" alt="dependency status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An extremely simple (&amp;amp; blazingly fast) library for HTTP &amp;amp; HTTPS servers in Rust&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Brian3647/snowboard/issues" rel="noopener noreferrer"&gt;Request a feature/Report a bug&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

Table of Contents
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Brian3647/snowboard#snowboard-" rel="noopener noreferrer"&gt;&lt;strong&gt;Snowboard 🏂&lt;/strong&gt;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#quick-start" rel="noopener noreferrer"&gt;&lt;strong&gt;Quick start&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#async-routes" rel="noopener noreferrer"&gt;&lt;strong&gt;Async routes&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#tls" rel="noopener noreferrer"&gt;&lt;strong&gt;TLS&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#websockets" rel="noopener noreferrer"&gt;&lt;strong&gt;Websockets&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#routing" rel="noopener noreferrer"&gt;&lt;strong&gt;Routing&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Brian3647/snowboard#integration" rel="noopener noreferrer"&gt;&lt;strong&gt;Integration&lt;/strong&gt;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#json" rel="noopener noreferrer"&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#responselike" rel="noopener noreferrer"&gt;&lt;strong&gt;ResponseLike&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#msrv-minimum-supported-rust-version" rel="noopener noreferrer"&gt;&lt;strong&gt;MSRV (Minimum Supported Rust Version)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#contributing" rel="noopener noreferrer"&gt;&lt;strong&gt;Contributing&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Brian3647/snowboard#license" rel="noopener noreferrer"&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;Quick start&lt;/strong&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;To get started with Snowboard, simply add it to your &lt;code&gt;Cargo.toml&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight highlight-source-toml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;[&lt;span class="pl-en"&gt;dependencies&lt;/span&gt;]
&lt;span class="pl-smi"&gt;snowboard&lt;/span&gt; = &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;*&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then, create a new Rust file with the following code:&lt;/p&gt;
&lt;div class="highlight highlight-source-rust notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;use&lt;/span&gt; snowboard&lt;span class="pl-kos"&gt;::&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;headers&lt;span class="pl-kos"&gt;,&lt;/span&gt; response&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-v"&gt;Method&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-v"&gt;Result&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-v"&gt;Server&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;fn&lt;/span&gt; &lt;span class="pl-en"&gt;main&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; -&amp;gt; &lt;span class="pl-smi"&gt;Result&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-k"&gt;let&lt;/span&gt; data = &lt;span class="pl-s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

    &lt;span class="pl-k"&gt;let&lt;/span&gt; server = &lt;span class="pl-smi"&gt;Server&lt;/span&gt;&lt;span class="pl-kos"&gt;::&lt;/span&gt;&lt;span class="pl-en"&gt;new&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;"localhost:8080"&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;?&lt;span class="pl-kos"&gt;;&lt;/span&gt;

    &lt;span class="pl-en"&gt;println&lt;/span&gt;&lt;span class="pl-en"&gt;!&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;"Listening on {}"&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; server&lt;span class="pl-kos"&gt;.&lt;/span&gt;pretty_addr&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;?&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

    server&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;run&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-k"&gt;move&lt;/span&gt; |&lt;span class="pl-k"&gt;mut&lt;/span&gt; req| &lt;span class="pl-kos"&gt;{&lt;/span&gt;
        &lt;span class="pl-k"&gt;if&lt;/span&gt; req&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;method&lt;/span&gt; == &lt;span class="pl-smi"&gt;Method&lt;/span&gt;&lt;span class="pl-kos"&gt;::&lt;/span&gt;&lt;span class="pl-v"&gt;DELETE&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
            &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-en"&gt;response&lt;/span&gt;&lt;span class="pl-en"&gt;!&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Brian3647/snowboard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>🦀⚡ Building extremely fast APIs with Rust &amp; snowboard: Step-by-Step</title>
      <dc:creator>vicmdv</dc:creator>
      <pubDate>Thu, 26 Oct 2023 15:02:39 +0000</pubDate>
      <link>https://dev.to/vicmdv/building-extremely-fast-apis-with-rust-snowboard-step-by-step-365g</link>
      <guid>https://dev.to/vicmdv/building-extremely-fast-apis-with-rust-snowboard-step-by-step-365g</guid>
      <description>&lt;p&gt;Today we'll be writing a working &lt;a href="https://es.wikipedia.org/wiki/Web_API" rel="noopener noreferrer"&gt;web API&lt;/a&gt; using &lt;strong&gt;rust&lt;/strong&gt; and &lt;a href="https://crates.io/crates/snowboard" rel="noopener noreferrer"&gt;snowboard&lt;/a&gt;, an extremely simple HTTP library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contents
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Setting up the server&lt;/li&gt;
&lt;li&gt;Creating the routes&lt;/li&gt;
&lt;li&gt;Wrapping up&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You'll need to have &lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;rust&lt;/a&gt; installed for this project.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Setting up the server
&lt;/h2&gt;

&lt;p&gt;First off, we'll create the project (that will be named "faster") and install snowboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo new faster
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;faster
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo add snowboard@0.4.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we will add the following code to &lt;code&gt;src/main.rs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;snowboard&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.run&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Request: {:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nd"&gt;response!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and run it using &lt;code&gt;cargo run&lt;/code&gt;. And that's it! You got yourself a working server on localhost:3000. Now, to the API functionality&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Creating the routes
&lt;/h2&gt;

&lt;p&gt;Instead of using that closure, we'll be writing our app router in a new function called &lt;code&gt;router&lt;/code&gt; and adding some routes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;snowboard&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="nf"&gt;.parse_url&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="nf"&gt;.at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="nf"&gt;.at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;response!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;format!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, {}!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
            &lt;span class="nb"&gt;None&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;response!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nb"&gt;None&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;response!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Send a request to /hello to get a greeting!"&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;response!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"👀"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code, we're doing a lot of things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We're checking for the first part of the path (&lt;code&gt;url/this&lt;/code&gt;). If the request is just &lt;code&gt;/&lt;/code&gt;, that'll be &lt;code&gt;None&lt;/code&gt; where we return an ok response (point 5).&lt;/li&gt;
&lt;li&gt;If it matches and it's "/hello" we check for the second part of the path (&lt;code&gt;url/hello/this&lt;/code&gt;). If it exists, we get it and say hello to them. If it doesn't, we just return "Hello, world!".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it works perfectly! You can check it out for yourself on your terminal using &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl localhost:3000/
Send a request to /hello to get a greeting!
$ curl localhost:3000/hello
Hello, World!
$ curl localhost:3000/hello/Joe
Hello, Joe!
$ curl localhost:3000/thisroutedoesntexist
👀
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Wrapping up
&lt;/h2&gt;

&lt;p&gt;That's it for today! You got yourself an extremely fast &amp;amp; simple API written in Rust. You can check out snowboard &lt;a href="https://github.com/Brian3647/snowboard" rel="noopener noreferrer"&gt;here&lt;/a&gt; on contact me in discord @ Brian3647.&lt;/p&gt;

&lt;p&gt;If needed, snowboard also supports &lt;code&gt;async/await&lt;/code&gt; routes, so feel free to expand your API however you want to.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>rust</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
