defmodule AccessGrid.CardTemplatePair do @moduledoc """ Full representation of a template pair, as returned by `AccessGrid.Console.read_template/2` when the resolved id belongs to a pair. The same `card-templates/:id` endpoint serves both single templates and pairs; the server marks pairs with `is_pair: true` and embeds the full member templates under `templates`. For the lightweight list-view shape, see `AccessGrid.CardTemplatePair.Summary`. """ alias AccessGrid.CardTemplate @type t :: %__MODULE__{ id: String.t() | nil, name: String.t() | nil, templates: [CardTemplate.t()] } defstruct [ :id, :name, templates: [] ] @doc """ Creates a CardTemplatePair struct from an API response map. """ @spec from_response(map()) :: t() def from_response(data) when is_map(data) do %__MODULE__{ id: data["id"], name: data["name"], templates: Enum.map(data["templates"] || [], &CardTemplate.from_response/1) } end end defmodule AccessGrid.CardTemplatePair.Summary do @moduledoc """ Minimal representation of a template pair, as returned by `AccessGrid.Console.list_card_template_pairs/1`. Holds the pair's identity plus platform-keyed summaries of its member templates. For the full pair representation (returned from `AccessGrid.Console.read_template/2` when the resolved id belongs to a pair), see `AccessGrid.CardTemplatePair`. """ alias AccessGrid.CardTemplate @type t :: %__MODULE__{ id: String.t() | nil, name: String.t() | nil, created_at: String.t() | nil, android_template: CardTemplate.Summary.t() | nil, ios_template: CardTemplate.Summary.t() | nil } defstruct [ :id, :name, :created_at, :android_template, :ios_template ] @doc """ Creates a CardTemplatePair.Summary struct from an API response map. """ @spec from_response(map()) :: t() def from_response(data) when is_map(data) do %__MODULE__{ id: data["id"], name: data["name"], created_at: data["created_at"], android_template: CardTemplate.Summary.from_response(data["android_template"]), ios_template: CardTemplate.Summary.from_response(data["ios_template"]) } end end