lib/dust.ex

defmodule Dust do
  @moduledoc """
  Documentation for `Dust`.
  """
  alias Dust.Requests.Result
  alias Dust.{Fetcher, HTML, Parsers, Requests}

  @doc """
  Fetch given url with scripts, stylesheets and image assets
  """
  @spec get(String.t(), Keyword.t()) :: Result.t()
  def get(url, options \\ [])

  def get(url, options) do
    {:ok, result, state} = Requests.get(url, options)

    options = [
      headers: state.headers,
      proxy: state.proxy,
      options: state.proxy
    ]

    assets =
      result.content
      |> Parsers.parse()
      |> Fetcher.fetch(result.base_url, options)
      |> Fetcher.CSS.fetch(state)

    %Result{
      result
      | full_content: [
          HTML.inline(result.content, assets),
          HTML.Styles.inline(assets),
          HTML.Scripts.inline(assets),
          "</html>"
        ],
        assets: assets
    }
  end

  @doc """
  Save result to file
  """
  def persist(contents, path) when is_list(contents) do
    with {:ok, file} <- File.open(path, [:write]) do
      IO.binwrite(file, contents)
      File.close(file)
    end
  end
  def persist(%Requests.Result{} = result, path) do
    persist(result.full_content, path)
  end
end