Error reported in custom router plug, but I see no error?

Hi Folks,

I am trying to add a custom authorisation plug to my router, and I am getting an error in VSCode for the following code, and I can’t really work out why it’s complaining, been staring at this for a couple go hours now and was wondering if anyone could put me out of my misery?

Here’s the code, it’s pretty basic stuff.

  def require_admin_user(%{current_user: current_user} = conn, _opts) do
    if current_user.admin do
      conn
    else
      conn
      |> put_flash(:error, "You must log in to access this page.")
      |> maybe_store_return_to()
      |> redirect(to: Routes.user_session_path(conn, :new))
      |> halt()
    end
  end

  def require_admin_user(conn, _opts) do
    conn
    |> put_flash(:error, "You must log in to access this page.")
    |> maybe_store_return_to()
    |> redirect(to: Routes.user_session_path(conn, :new))
    |> halt()
  end

It’s the conn in the else of the def require_admin_user(%{current_user: current_user} = conn, _opts) function that it’s complaining about:

The call 'Elixir.Phoenix.Controller':put_flash
         (_conn@1 :: #{'current_user' := _, _ => _},
          'error',
          <<89,111,117,32,109,117,115,116,32,108,111,103,32,
            105,110,32,116,111,32,97,99,99,101,115,115,32,
            116,104,105,115,32,112,97,103,101,46>>) will never return since it differs in the 1st argument from the success typing arguments: 
         (#{'__struct__' := 'Elixir.Plug.Conn',
            'adapter' := {atom(), _},
            'assigns' := #{atom() => _},
            'body_params' :=
                #{'__struct__' => 'Elixir.Plug.Conn.Unfetched',
                  'aspect' => atom(),
                  binary() => _},
            'cookies' :=
                #{'__struct__' => 'Elixir.Plug.Conn.Unfetched',
                  'aspect' => atom(),
                  binary() => _},
            'halted' := boolean(),
            'host' := binary(),
            'method' := binary(),
            'owner' := pid(),
            'params' :=
                #{'__struct__' => 'Elixir.Plug.Conn.Unfetched',
                  'aspect' => atom(),
                  binary() => _},
            'path_info' := [binary()],
            'path_params' :=
                #{binary() =>
                      binary() |
                      [binary() | [any()] | map()] |
                      #{binary() => binary() | [any()] | map()}},
            'port' := char(),
            'private' := #{atom() => _},
            'query_params' :=
                #{'__struct__' => 'Elixir.Plug.Conn.Unfetched',
                  'aspect' => atom(),
                  binary() =>
                      binary() |
                      [binary() | [any()] | map()] |
                      #{binary() => binary() | [any()] | map()}},
            'query_string' := binary(),
            'remote_ip' :=
                {byte(), byte(), byte(), byte()} |
                {char(),
                 char(),
                 char(),
                 char(),
                 char(),
                 char(),
                 char(),
                 char()},
            'req_cookies' :=
                #{'__struct__' => 'Elixir.Plug.Conn.Unfetched',
                  'aspect' => atom(),
                  binary() => binary()},
            'req_headers' := [{binary(), binary()}],
            'request_path' := binary(),
            'resp_body' :=
                'nil' |
                binary() |
                maybe_improper_list(binary() |
                                    maybe_improper_list(any(),
                                                        binary() | []) |
                                    byte(),
                                    binary() | []),
            'resp_cookies' := #{binary() => map()},
            'resp_headers' := [{binary(), binary()}],
            'scheme' := 'http' | 'https',
            'script_name' := [binary()],
            'secret_key_base' := 'nil' | binary(),
            'state' :=
                'chunked' | 'file' | 'sent' | 'set' | 'set_chunked' |
                'set_file' | 'unset',
            'status' := 'nil' | non_neg_integer()},
          atom() | binary(),
          any())

Assigns are in conn.assigns not directly in conn, so your pattern match is missing a layer.

Of course, been staring at it for so long I was blind to the obvious.

THANK YOU!