defmodule CookieJar do
alias CookieJar.Cookie
@moduledoc """
CookieJar is here to store your cookie
"""
@doc """
Create a new cookie jar
## Examples
CookieJar.start_link
# or
CookieJar.new
"""
@spec start_link(keyword) :: GenServer.on_start()
def start_link(opts \\ []), do: CookieJar.Server.start_link(opts)
@doc """
See what's in the cookie jar, the individual cookies
## Examples
iex> {:ok, jar} = CookieJar.new
iex> CookieJar.peek(jar)
%{}
iex> CookieJar.put(jar, {"name", "john doe"})
iex> CookieJar.peek(jar)
%{"name" => "john doe"}
"""
@spec peek(GenServer.server()) :: map
def peek(jar) do
GenServer.call(jar, :peek)
end
@doc """
See what's in the cookie jar, the individual cookies available to a URI
"""
@spec peek(GenServer.server(), String.t()) :: map
def peek(jar, uri_str) do
GenServer.call(jar, {:peek, URI.parse(uri_str)})
end
@doc """
Get the cookies in Cookie format
## Examples
CookieJar.to_string(jar)
# or
CookieJar.label(jar)
iex> {:ok, jar} = CookieJar.new
iex> CookieJar.to_string(jar)
""
iex> CookieJar.put(jar, {"a", 1})
iex> CookieJar.put(jar, {"b", 2})
iex> CookieJar.to_string(jar)
"a=1; b=2"
"""
@spec to_string(GenServer.server()) :: String.t()
def to_string(jar) do
GenServer.call(jar, :to_string)
end
@doc """
Get the cookies in Cookie format for the given URI
"""
@spec to_string(GenServer.server(), String.t()) :: String.t()
def to_string(jar, uri_str) do
GenServer.call(jar, {:to_string, URI.parse(uri_str)})
end
@doc """
Put cookie into a cookie jar
## Examples
iex> {:ok, jar} = CookieJar.new
iex> CookieJar.peek(jar)
%{}
iex> CookieJar.put(jar, {"a", 1})
iex> CookieJar.put(jar, {"b", 2})
iex> CookieJar.to_string(jar)
"a=1; b=2"
"""
@spec put(GenServer.server(), Cookie.t() | {term, term}) :: :ok
def put(jar, cookie) do
GenServer.cast(jar, {:put, cookie})
end
@doc """
Put *new* cookie into a cookie jar
## Examples
iex> {:ok, jar} = CookieJar.new
iex> CookieJar.peek(jar)
%{}
iex> CookieJar.put(jar, {"a", 1})
iex> CookieJar.put_new(jar, {"a", 3})
iex> CookieJar.to_string(jar)
"a=1"
"""
@spec put_new(GenServer.server(), Cookie.t() | {term, term}) :: :ok
def put_new(jar, cookie) do
GenServer.cast(jar, {:put_new, cookie})
end
@doc """
Pour cookies into a cookie jar
## Examples
iex> {:ok, jar} = CookieJar.new
iex> CookieJar.peek(jar)
%{}
iex> CookieJar.pour(jar, %{"a" => 1, "b" => 2})
iex> CookieJar.peek(jar)
%{"a" => 1, "b" => 2}
"""
@spec pour(GenServer.server(), list | map) :: :ok
def pour(jar, cookies) do
GenServer.cast(jar, {:pour, cookies})
end
@doc """
Pour cookies into a cookie jar, using cookie strings and a uri string
"""
@spec pour(GenServer.server(), list, String.t()) :: :ok
def pour(jar, cookie_strs, uri_str) do
uri = URI.parse(uri_str)
cookies =
cookie_strs
|> Enum.map(&Cookie.parse(&1, uri))
|> Enum.reject(&is_nil/1)
GenServer.cast(jar, {:pour, cookies})
end
@doc """
Destroy a cookie jar
## Examples
CookieJar.stop(jar)
# or
CookieJar.smash(jar)
iex> {:ok, jar} = CookieJar.new
iex> CookieJar.stop(jar)
iex> Process.alive?(jar)
false
"""
@spec stop(GenServer.server()) :: :ok
def stop(jar) do
GenServer.stop(jar)
end
defdelegate new(opts \\ []), to: __MODULE__, as: :start_link
defdelegate label(jar), to: __MODULE__, as: :to_string
defdelegate label(jar, uri_str), to: __MODULE__, as: :to_string
defdelegate smash(jar), to: __MODULE__, as: :stop
end