defmodule Exhtml do @type slug :: binary | atom @moduledoc """ Exhtml serves HTML contents. It fetches content from backend storage and saves in its state. HTML contents are responded to user directly from state. ## Examples: iex> Exhtml.start [] ...> #update ...> Exhtml.update_content(:foo) "default_content_for_foo" iex> # get ...> Exhtml.get_content(:foo) "default_content_for_foo" """ @name {:global, :exhtml_host} @doc false def start(opts) do opts |> Keyword.put(:name, @name) |> Exhtml.Host.start_link end @doc """ Sets the content fetcher. A content fetcher is used when `Exhtml.update_content/1` is called. You can pass a function or module as content fetcher. Returns `:ok`. ## Examples: iex> Exhtml.start [] ...> Exhtml.set_content_fetcher(fn slug -> "Hi, #\{slug}!" end) :ok iex> Exhtml.update_content(:foo) "Hi, foo!" iex> Exhtml.get_content(:foo) "Hi, foo!" """ @spec set_content_fetcher((slug -> any) | module) :: :ok def set_content_fetcher(f) do Exhtml.Host.set_content_fetcher(@name, f) end @doc """ Gets html content from a host. * `slug` is the key of content to get. ## Examples: iex> Exhtml.start [] ...> Exhtml.set_content(:foo, :bar) ...> Exhtml.get_content(:foo) :bar """ @spec get_content(slug) :: any def get_content(slug) do Exhtml.Host.get_content(@name, slug) end @doc """ Sets html content to a host with a slug. * `slug` is the key of content. * `value` is the content. Returns `:ok`. ## Examples: iex> Exhtml.start [] ...> Exhtml.set_content(:foo, :bar) ...> Exhtml.get_content(:foo) :bar """ @spec set_content(slug, any) :: :ok def set_content(slug, value) do Exhtml.Host.set_content(@name, slug, value) end @doc """ Fetchs and sets the content from the storage to a host's table. * `slug` is the key of content. Returns anything returned by the fetcher. ## Examples: iex> Exhtml.start [] ...> Exhtml.set_content_fetcher fn slug -> "Hi, #\{slug}!" end ...> Exhtml.update_content :wuliu "Hi, wuliu!" """ @spec update_content(slug) :: any def update_content(slug) do Exhtml.Host.update_content(@name, slug) end @doc """ Deletes the content from a host. * `slug` is the key of content. Returns `:ok`. ## Examples: iex> Exhtml.start [] ...> Exhtml.set_content :foo, :bar ...> Exhtml.get_content :foo :bar iex> Exhtml.delete_content :foo :ok iex> Exhtml.get_content :foo nil """ @spec delete_content(slug) :: :ok def delete_content(slug) do Exhtml.Host.delete_content(@name, slug) end end