defmodule ExTrade do @moduledoc """ ExTrade is an Elixir client library for interacting with the [E*TRADE API](https://developer.etrade.com/home). ExTrade manages current authorization state (e.g., request and access tokens) in a supervised process, which serves as an in-memory data store for constructing the necessary "Authorization" header for each API request, per the [OAuth 1.0](https://oauth.net/core/1.0a) specification that E*TRADE follows. """ use Application import ExTrade.Utils @doc false def start(_start_type, _args) do import Supervisor.Spec, warn: false children = [ExTrade.Authorization.Store, ExTrade.Authorization.Worker] opts = [strategy: :one_for_one, name: Extrade.Supervisor] Supervisor.start_link(children, opts) end defmacro __using__(_) do quote do @doc false @spec cast(map()) :: __MODULE__.t() def cast(map) when is_map(map) do map |> Map.new(fn {k, v} -> if is_list(v) do {format_key(k), Enum.map(v, &format_value(k, &1))} else {format_key(k), format_value(k, v)} end end) |> then(&struct(__MODULE__, &1)) end end end end