lib/api2pdf/wkhtml.ex

defmodule Api2pdf.Wkhtml do
  @moduledoc """
  Convert HTML document or web page to PDF using Wkhtml backend.
  """

  alias Api2pdf.Model.{
    ApiSuccessResponse,
    WkhtmlHtmlToPdfRequest,
    WkhtmlUrlToPdfRequest
  }

  @doc """
  Convert HTML document to PDF with default configuration.

  For a full control of request options please use `request/2`.

  ## Examples

  ```
  Api2pdf.Wkhtml.html_to_pdf("<p>", tag: "some-tag")
  ```
  """
  @spec html_to_pdf(String.t(), keyword) ::
          {:error, any} | {:ok, ApiSuccessResponse.t()}
  def html_to_pdf(html, options \\ []),
    do: %WkhtmlHtmlToPdfRequest{html: html} |> request(options)

  @doc """
  Convert URL to PDF with default configuration.

  For a full control of request options please use `request/2`.

  ## Examples

  ```
  Api2pdf.Wkhtml.url_to_pdf("https://example.com", tag: "some-tag")
  ```
  """
  @spec url_to_pdf(String.t(), keyword) ::
          {:error, any} | {:ok, ApiSuccessResponse.t()}
  def url_to_pdf(url, options \\ []),
    do: %WkhtmlUrlToPdfRequest{url: url} |> request(options)

  @doc """
  Send a convert request with an option to specify complete
  parameters that are supported by the API.

  Payloads are modeled in the form of struct and options is keyword.

  Available request payloads:

  * `Api2pdf.Model.WkhtmlHtmlToPdfRequest`
  * `Api2pdf.Model.WkhtmlUrlToPdfRequest`

  ## Examples

  ```
  payload = %Api2pdf.Model.WkhtmlUrlToPdfRequest{url: "https://example.com", inline: false}
  result = request(payload, tag: "some-tag")
  ```
  """
  @spec request(struct, keyword) :: {:error, any} | {:ok, ApiSuccessResponse.t()}
  def request(payload, options \\ [])

  def request(%WkhtmlHtmlToPdfRequest{} = payload, options) do
    Api2pdf.make_post_request("/wkhtml/pdf/html", payload, options)
  end

  def request(%WkhtmlUrlToPdfRequest{} = payload, options) do
    Api2pdf.make_post_request("/wkhtml/pdf/url", payload, options)
  end
end