defmodule ExTeal.ActionResponse do
  @moduledoc """
  Used to return the result of an action
  and specifies how the ux should respond

  @serialized ~w(message url type path)a
  @derive {Jason.Encoder, only: @serialized}

  defstruct [:message, :url, :type, :path]

  alias __MODULE__

  @type t :: %__MODULE__{}

  @doc """
  Display a custom 'success' message.
  @spec success(String.t()) :: ActionResponse.t()
  def success(message), do: %ActionResponse{type: "success", message: message}

  @doc """
  Display a custom 'error' message.
  @spec error(String.t()) :: ActionResponse.t()
  def error(message), do: %ActionResponse{type: "error", message: message}

  @doc """
  Redirect the user to a url
  @spec redirect(String.t()) :: ActionResponse.t()
  def redirect(url), do: %ActionResponse{type: "redirect", url: url}

  @doc """
  Push the user to a new location in the vue app.
  @spec push(String.t()) :: ActionResponse.t()
  def push(path), do: %ActionResponse{type: "push", path: path}

  @doc """
  Download a file at a specific url
  @spec download(String.t()) :: ActionResponse.t()
  def download(url), do: %ActionResponse{type: "download", url: url}