<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="188563" data-post-id="188563">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I am having some weird dialyzer errors following the examples in the deocumentation:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">  defmodule ChangeAvatarRequest do
    @moduledoc "Schema for requests to change a user's avatar."
    require OpenApiSpex

    OpenApiSpex.schema(%{
      type: :object,
      properties: %{
        avatar: %Schema{
          type: :string,
          format: :binary
        }
      }
    })
  end

  @doc "Upload a new profile image."
  @doc request_body:
         {"Image Upload Form", "multipart/form-data", __MODULE__.ChangeAvatarRequest,
          required: true},
       responses: %{
         200 =&gt; {"Avatar URL", "application/json", %Schema{type: :string}},
         422 =&gt; OpenApiSpex.JsonErrorResponse.response()
       }
  def upload_avatar(conn = %{body_params: %ChangeAvatarRequest{} = request}, _params) do
    IO.inspect(request, label: "===========&gt; ")
    # FIXME Remove the hardcoded uuid.
    user_uuid = "dccc5004-24db-4eec-b0f9-ffe9be0fad8c"
    # FIXME This construct is brittle if the user_uuid is invalid
    {:ok, pid} = UserDCSP.find_or_start(user_uuid)

    upload_info = %{
      content_type: request.avatar.content_type,
      filename: request.avatar.filename,
      path: request.avatar.path
    }

    case UserDCSP.change_avatar(pid, upload_info) do
      {:ok, avatar_url} -&gt; render(conn, "ok.json", response: avatar_url)
      {:error, e} -&gt; render(conn, "error.json", reason: e)
    end
  end
</code></pre>
<p>Gives</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">lib/xsiom_vue/controllers/user_controller.ex:114:call
The function call will not succeed.

Phoenix.Controller.render(
  _conn :: %{:body_params =&gt; %XsiomVue.UserController.ChangeAvatarRequest{_ =&gt; _}, _ =&gt; _},
  &lt;&lt;101, 114, 114, 111, 114, 46, 106, 115, 111, 110&gt;&gt;,
  [{:reason, _}, ...]
)

will never return since the success typing is:
(
  %Plug.Conn{
    ...
    :body_params =&gt; %Plug.Conn.Unfetched{:aspect =&gt; atom(), binary() =&gt; _},
    ...
  },
  atom() | binary(),
  atom() | binary() | [{_, _}] | map()
) :: %Plug.Conn{
    ...
  :body_params =&gt; %Plug.Conn.Unfetched{:aspect =&gt; atom(), binary() =&gt; _},
    ...
}

and the contract is
(Plug.Conn.t(), binary() | atom(), Keyword.t() | map() | binary() | atom()) ::
  Plug.Conn.t()
</code></pre>
<p>I can make the error go away by not putting it in the match line but then it fails. The code works but dialyzer is very mad.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188563" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/32">Post #31</a>
	                </div>
	            </div>
              <div id="likers-container-188563" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188563"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #31"></div>
  </section>
</div>
    <div class="postbit" id="188587" data-post-id="188587">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mbuhot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mbuhot/120/33444_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mbuhot
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/rsimmonsjr" rel="nofollow">@rsimmonsjr</a> Yeah unfortunately when we swap <code>body_params</code> on the conn with structs it breaks the typespecs.</p>
<p>There’s an issue in the Github repo with a workaround to silence dialyzer, but I think we’ll need to release a breaking change eventually to store the converted parameters somewhere in <code>Conn.private</code> instead of <code>Conn.body_params</code>.</p>
<p><a href="https://github.com/open-api-spex/open_api_spex/issues/92#issuecomment-575568868" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/open-api-spex/open_api_spex/issues/92#issuecomment-575568868</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188587" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/33">Post #32</a>
	                </div>
	            </div>
              <div id="likers-container-188587" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188587"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #32"></div>
  </section>
</div>
    <div class="postbit" id="188658" data-post-id="188658">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Bah, Spent hours on this.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188658" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/34">Post #33</a>
	                </div>
	            </div>
              <div id="likers-container-188658" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188658"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #33"></div>
  </section>
</div>
    <div class="postbit" id="188722" data-post-id="188722">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I think the fix for putting the request in the private data should be implemented as soon as possible. I like using dialyzer to check my code but spurious false errors are problematic since now I have them all over the place.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188722" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/35">Post #34</a>
	                </div>
	            </div>
              <div id="likers-container-188722" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188722"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #34"></div>
  </section>
</div>
    <div class="postbit" id="188749" data-post-id="188749">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mbuhot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mbuhot/120/33444_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mbuhot
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="rsimmonsjr" data-post="35" data-topic="15614">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/r/ebca7d/48.png" class="avatar"> rsimmonsjr:</div>
<blockquote>
<p>putting the request in the private data should be implemented as soon as possible</p>
</blockquote>
</aside>
<p>As it will require a breaking change to the API it won’t be updated until the next major version.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188749" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/36">Post #35</a>
	                </div>
	            </div>
              <div id="likers-container-188749" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188749"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #35"></div>
  </section>
</div>
    <div class="postbit" id="188751" data-post-id="188751">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="moxley" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/moxley/120/37673_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  moxley
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>There is a way to easily work around this problem:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir"># Get body params
def create(conn, _params) do
  # Dialyzer misses the fact that you are accessing body_params
  body_params = Map.get(conn, :body_params)
  # You are now free to reference compile-time atom keys from body params
  %{user: user_params} = body_params
end

# Get other params
def create(conn, params) do
  # Dialyzer misses the fact that you are accessing a param value using an atom key
  id = Map.get(params, :id)
end
</code></pre>
<p>This solution is now added to the Github issue.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188751" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/37">Post #36</a>
	                </div>
	            </div>
              <div id="likers-container-188751" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188751"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #36"></div>
  </section>
</div>
    <div class="postbit" id="188888" data-post-id="188888">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Well it doesn’t allow the check and validation which I like so its not a complete “solution” but rather a compromise that ditches functionality to silence dialyzer.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188888" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/38">Post #37</a>
	                </div>
	            </div>
              <div id="likers-container-188888" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188888"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #37"></div>
  </section>
</div>
    <div class="postbit" id="188923" data-post-id="188923">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="moxley" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/moxley/120/37673_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  moxley
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<blockquote>
<p>Well it doesn’t allow the check and validation which I like so its not a complete “solution” but rather a compromise that ditches functionality to silence dialyzer.</p>
</blockquote>
<p>That’s not true. This solution works with the <code>CastAndValidate</code> plug and its functionality. Here’s a more complete example showing that <code>CastAndValidate</code> is being used:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyAppWeb.MyController do
  use MyAppWeb, :controller
  use OpenApiSpex.Controller

  plug OpenApiSpex.Plug.CastAndValidate, json_render_error_v2: true

  # Use body params
  def create(conn, _params) do
    # Dialyzer misses the fact that body_params is being accessed
    body_params = Map.get(conn, :body_params)
    # The code is now free to reference compile-time atom keys from body params, without complaint from Dialyzer
    %{user: user_params} = body_params
  end

  # Use other params
  def create(conn, params) do
    # Dialyzer misses the fact that a param value is being accessed using an atom key
    id = Map.get(params, :id)
  end
end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188923" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/39">Post #38</a>
	                </div>
	            </div>
              <div id="likers-container-188923" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188923"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #38"></div>
  </section>
</div>
    <div class="postbit" id="189163" data-post-id="189163">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I don’t know how that could possibly work. Does the plug intercept the function before it is called maybe? I though CastAndValidate would be called when we tried to cast the type which you aren’t even doing here.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="189163" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/40">Post #39</a>
	                </div>
	            </div>
              <div id="likers-container-189163" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="189163"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #39"></div>
  </section>
</div>
    <div class="postbit" id="189166" data-post-id="189166">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mbuhot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mbuhot/120/33444_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mbuhot
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="rsimmonsjr" data-post="40" data-topic="15614">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/r/ebca7d/48.png" class="avatar"> rsimmonsjr:</div>
<blockquote>
<p>Does the plug intercept the function before it is called maybe?</p>
</blockquote>
</aside>
<p>Yes, plugs in a Phoenix controller are run before the controller action is run: <a href="https://hexdocs.pm/phoenix/Phoenix.Controller.html#module-plug-pipeline" class="inline-onebox" rel="noopener nofollow ugc">Phoenix.Controller — Phoenix v1.8.8</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="189166" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/41">Post #40</a>
	                </div>
	            </div>
              <div id="likers-container-189166" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="189166"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #40"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/15614/load_more?page=5">Load more posts (14 remaining)</a>
</div></template></turbo-stream>