defmodule Patreon.API.V2.Resource.Campaign do @type t :: %__MODULE__{ created_at: DateTime.t, creation_name: String.t | nil, discord_server_id: String.t | nil, google_analytics_id: String.t | nil, has_rss: boolean, has_sent_rss_notify: boolean, image_small_url: String.t, image_url: String.t, is_charged_immediately: boolean | nil, is_monthly: boolean | nil, is_nsfw: boolean, main_video_embed: String.t | nil, main_video_url: String.t | nil, one_liner: String.t | nil, patron_count: integer, pay_per_name: String.t | nil, published_at: DateTime.t, rss_artwork_url: String.t | nil, rss_feed_title: String.t, show_earnings: boolean, summary: String.t | nil, thanks_embed: String.t | nil, thanks_msg: String.t | nil, thanks_video_url: String.t | nil, url: String.t, vanity: String.t | nil } defstruct [ :id, :created_at, :creation_name, :discord_server_id, :google_analytics_id, :has_rss, :has_sent_rss_notify, :image_small_url, :image_url, :is_charged_immediately, :is_monthly, :is_nsfw, :main_video_embed, :main_video_url, :one_liner, :patron_count, :pay_per_name, :pledge_url, :published_at, :rss_artwork_url, :rss_feed_title, :show_earnings, :summary, :thanks_embed, :thanks_msg, :thanks_video_url, :url, :vanity, ] @spec from_response(map) :: %__MODULE__{} def from_response(%{data: data} = decoded) when is_list(data) do Enum.map(decoded.data, &from_response/1) end @spec from_response(map) :: %__MODULE__{} def from_response(%{data: data}) do from_response(data) end @spec from_response(map) :: %__MODULE__{} def from_response(data) do campaign = %{id: data.id} |> Map.merge(data.attributes) Kernel.struct(__MODULE__, campaign) end def opts_to_query([]) do [] end def opts_to_query(include_fields) do Enum.reduce(include_fields, ["fields[campaign]": "", "fields[tiers]": "", "fields[creator]": "", "fields[benefits]": "", "fields[goals]": ""], &generate_query_option/2) |> Keyword.filter(fn({_key, val}) -> val != "" end) end defp generate_query_option({:campaign, []}, acc) do acc end defp generate_query_option({:campaign, campaign_fields}, acc) do Keyword.put(acc, :"fields[campaign]", Enum.join(campaign_fields, ",")) end defp generate_query_option(_todo, acc) do acc end end