Elixir Base64 encode and decode with errors

Elixir
defmodule Base64Codec do
  def encode(data) when is_binary(data), do: Base.encode64(data)

  def decode(encoded) when is_binary(encoded) do
    case Base.decode64(encoded, padding: true) do
      {:ok, data} -> {:ok, data}
      :error ->
        case Base.decode64(encoded, padding: false) do
          {:ok, data} -> {:ok, data}
          :error -> {:error, :invalid_base64}
        end
    end
  end

  def decode!(encoded) do
    case decode(encoded) do
      {:ok, data} -> data
      {:error, _reason} -> raise ArgumentError, "invalid base64 input"
    end
  end
end