{"data":{"markdownRemark":{"id":"65dc7c1b-50c1-5ffd-8694-4b400ef14aee","html":"<p>I was watching an elixirconf talk the other day about pipelines and how to handle long pipelines and I learned a really useful coding technique!</p>\n<p>I typed up this module to demonstrate:</p>\n<div class=\"gatsby-highlight\" data-language=\"elixir\"><pre class=\"language-elixir\"><code class=\"language-elixir\"><span class=\"token keyword\">defmodule</span> Brunch <span class=\"token keyword\">do</span>\n  <span class=\"token keyword\">def</span> make_bloody_mary<span class=\"token punctuation\">(</span>missing_ingredient<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Making Brunch:\"</span><span class=\"token punctuation\">)</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"________\"</span><span class=\"token punctuation\">)</span>\n\n    with <span class=\"token atom symbol\">:ok</span> <span class=\"token operator\">&lt;-</span> add_tomato_juice<span class=\"token punctuation\">(</span>missing_ingredient<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n         <span class=\"token atom symbol\">:ok</span> <span class=\"token operator\">&lt;-</span> add_tobasco_sauce<span class=\"token punctuation\">(</span>missing_ingredient<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n         <span class=\"token atom symbol\">:ok</span> <span class=\"token operator\">&lt;-</span> add_celery_salt<span class=\"token punctuation\">(</span>missing_ingredient<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n         <span class=\"token atom symbol\">:ok</span> <span class=\"token operator\">&lt;-</span> add_horseradish<span class=\"token punctuation\">(</span>missing_ingredient<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n         <span class=\"token atom symbol\">:ok</span> <span class=\"token operator\">&lt;-</span> add_vodka<span class=\"token punctuation\">(</span>missing_ingredient<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n      success_step<span class=\"token punctuation\">(</span><span class=\"token atom symbol\">:ok</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">else</span>\n      <span class=\"token punctuation\">{</span><span class=\"token atom symbol\">:error</span><span class=\"token punctuation\">,</span> <span class=\"token atom symbol\">:out_of_vodka</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">-></span> add_whisky<span class=\"token punctuation\">(</span><span class=\"token atom symbol\">:ok</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|></span> success_step<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">{</span><span class=\"token atom symbol\">:error</span><span class=\"token punctuation\">,</span> message<span class=\"token punctuation\">}</span> <span class=\"token operator\">-></span> error_step<span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">)</span>\n      _ <span class=\"token operator\">-></span> unknown_step<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">end</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_tomato_juice<span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Adding tomato juice\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token atom symbol\">:ok</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_tobasco_sauce<span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Adding tobasco sauce\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token atom symbol\">:ok</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_horseradish<span class=\"token punctuation\">(</span><span class=\"token atom symbol\">:horseradish</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Adding horseradish\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span><span class=\"token atom symbol\">:error</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"You forgot to pick up horseradish!!\"</span><span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_horseradish<span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Adding horseradish\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token atom symbol\">:ok</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_celery_salt<span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Adding celery salt\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token atom symbol\">:ok</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_vodka<span class=\"token punctuation\">(</span><span class=\"token atom symbol\">:vodka</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Adding vodka.\"</span><span class=\"token punctuation\">)</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Oh no! You forgot to pick up vodka!\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span><span class=\"token atom symbol\">:error</span><span class=\"token punctuation\">,</span> <span class=\"token atom symbol\">:out_of_vodka</span><span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_vodka<span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Adding vodka.\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token atom symbol\">:ok</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> add_whisky<span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"No matter, we can use whisky instead.\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token atom symbol\">:ok</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> success_step<span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"You did it! Have a great brunch!\"</span><span class=\"token punctuation\">)</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> error_step<span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"You have ruined brunch, for reason: \"</span> <span class=\"token operator\">&lt;></span> message<span class=\"token punctuation\">)</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">end</span>\n\n  <span class=\"token keyword\">def</span> unknown_step<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span>\n    IO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"How did this even happen?!?\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">end</span>\n<span class=\"token keyword\">end</span>\n\nIO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span>\n  <span class=\"token string\">\"When we run this, things did not go as planned. However, we CAN recover from this. So we match on :out_of_vodka in our else block, and add whisky instead.\"</span>\n<span class=\"token punctuation\">)</span>\n\nIO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span><span class=\"token string\">\"Whisky is better in a bloody mary anyway\"</span><span class=\"token punctuation\">)</span>\nBrunch<span class=\"token punctuation\">.</span>make_bloody_mary<span class=\"token punctuation\">(</span><span class=\"token atom symbol\">:vodka</span><span class=\"token punctuation\">)</span>\n\nIO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span>\n  <span class=\"token string\">\"When we run this, we have hit an unrecoverable error, so we handle the error in our else block.\"</span>\n<span class=\"token punctuation\">)</span>\n\nBrunch<span class=\"token punctuation\">.</span>make_bloody_mary<span class=\"token punctuation\">(</span><span class=\"token atom symbol\">:horseradish</span><span class=\"token punctuation\">)</span>\n\nIO<span class=\"token punctuation\">.</span>inspect<span class=\"token punctuation\">(</span>\n  <span class=\"token string\">\"When we run this, the pipeline goes as expected, and we can enjoy our brunch in peace.\"</span>\n<span class=\"token punctuation\">)</span>\n\nBrunch<span class=\"token punctuation\">.</span>make_bloody_mary<span class=\"token punctuation\">(</span><span class=\"token atom symbol\">:all_good</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The output looks like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&quot;When we run this, things did not go as planned. However, we CAN recover from this. So we match on :out_of_vodka in our else block, and add whisky instead.&quot;\n&quot;Whisky is better in a bloody mary anyway&quot;\n&quot;Making Brunch:&quot;\n&quot;________&quot;\n&quot;Adding tomato juice&quot;\n&quot;Adding tobasco sauce&quot;\n&quot;Adding celery salt&quot;\n&quot;Adding horseradish&quot;\n&quot;Adding vodka.&quot;\n&quot;Oh no! You forgot to pick up vodka!&quot;\n&quot;No matter, we can use whisky instead.&quot;\n&quot;You did it! Have a great brunch!&quot;\n&quot;&quot;\n&quot;&quot;\n&quot;When we run this, we have hit an unrecoverable error, so we handle the error in our else block.&quot;\n&quot;Making Brunch:&quot;\n&quot;________&quot;\n&quot;Adding tomato juice&quot;\n&quot;Adding tobasco sauce&quot;\n&quot;Adding celery salt&quot;\n&quot;Adding horseradish&quot;\n&quot;You have ruined brunch, for reason: You forgot to pick up horseradish!!&quot;\n&quot;&quot;\n&quot;&quot;\n&quot;When we run this, the pipeline goes as expected, and we can enjoy our brunch in peace.&quot;\n&quot;Making Brunch:&quot;\n&quot;________&quot;\n&quot;Adding tomato juice&quot;\n&quot;Adding tobasco sauce&quot;\n&quot;Adding celery salt&quot;\n&quot;Adding horseradish&quot;\n&quot;Adding vodka.&quot;\n&quot;You did it! Have a great brunch!&quot;\n&quot;&quot;\n&quot;&quot;</code></pre></div>","frontmatter":{"date":"December 04, 2018","title":"Elixir: Using a with statement to control a pipeline","description":"A quick look and example using Elixir's `with` statement.","tags":["elixir","programming","elixirlang","syntax","pipelines"]}}},"pageContext":{"id":"65dc7c1b-50c1-5ffd-8694-4b400ef14aee"}}