defmodule Plaid.Institution.Status do @moduledoc """ [Plaid institution status schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-status) """ @behaviour Plaid.Castable alias Plaid.Castable defmodule Breakdown do @moduledoc """ [Plaid institution status breakdown schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-breakdown) """ @behaviour Castable @type t :: %__MODULE__{ success: number(), error_plaid: number(), error_institution: number(), refresh_interval: String.t() | nil } defstruct [ :success, :error_plaid, :error_institution, :refresh_interval ] @impl true def cast(generic_map) do %__MODULE__{ success: generic_map["success"], error_plaid: generic_map["error_plaid"], error_institution: generic_map["error_institution"], refresh_interval: generic_map["refresh_interval"] } end end defmodule Auth do @moduledoc """ [Plaid institution auth status schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-auth) """ @behaviour Castable @type t :: %__MODULE__{ status: String.t(), last_status_change: String.t(), breakdown: Breakdown.t() } defstruct [ :status, :last_status_change, :breakdown ] @impl true def cast(generic_map) do %__MODULE__{ status: generic_map["status"], last_status_change: generic_map["last_status_change"], breakdown: Castable.cast(Breakdown, generic_map["breakdown"]) } end end defmodule Balance do @moduledoc """ [Plaid institution balance status schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-balance) """ @behaviour Castable @type t :: %__MODULE__{ status: String.t(), last_status_change: String.t(), breakdown: Breakdown.t() } defstruct [ :status, :last_status_change, :breakdown ] @impl true def cast(generic_map) do %__MODULE__{ status: generic_map["status"], last_status_change: generic_map["last_status_change"], breakdown: Castable.cast(Breakdown, generic_map["breakdown"]) } end end defmodule HealthIncidentUpdate do @moduledoc """ [Plaid institution status health incident update schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-incident-updates) """ @behaviour Castable @type t :: %__MODULE__{ description: String.t(), status: String.t(), updated_date: String.t() } defstruct [ :description, :status, :updated_date ] @impl true def cast(generic_map) do %__MODULE__{ description: generic_map["description"], status: generic_map["status"], updated_date: generic_map["updated_date"] } end end defmodule HealthIncident do @moduledoc """ [Plaid institution status health incident schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-health-incidents) """ @behaviour Castable @type t :: %__MODULE__{ start_date: String.t() | nil, end_date: String.t() | nil, title: String.t(), incident_updates: [HealthIncidentUpdate.t()] } defstruct [ :start_date, :end_date, :title, :incident_updates ] @impl true def cast(generic_map) do %__MODULE__{ start_date: generic_map["start_date"], end_date: generic_map["end_date"], title: generic_map["title"], incident_updates: Castable.cast_list(HealthIncidentUpdate, generic_map["incident_updates"]) } end end defmodule Identity do @moduledoc """ [Plaid institution identity status schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-identity) """ @behaviour Castable @type t :: %__MODULE__{ status: String.t(), last_status_change: String.t(), breakdown: Breakdown.t() } defstruct [ :status, :last_status_change, :breakdown ] @impl true def cast(generic_map) do %__MODULE__{ status: generic_map["status"], last_status_change: generic_map["last_status_change"], breakdown: Castable.cast(Breakdown, generic_map["breakdown"]) } end end defmodule InvestmentsUpdates do @moduledoc """ [Plaid institution investments updates status schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-investments-updates) """ @behaviour Castable @type t :: %__MODULE__{ status: String.t(), last_status_change: String.t(), breakdown: Breakdown.t() } defstruct [ :status, :last_status_change, :breakdown ] @impl true def cast(generic_map) do %__MODULE__{ status: generic_map["status"], last_status_change: generic_map["last_status_change"], breakdown: Castable.cast(Breakdown, generic_map["breakdown"]) } end end defmodule ItemLogins do @moduledoc """ [Plaid institution item logins status schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-item-logins) """ @behaviour Castable @type t :: %__MODULE__{ status: String.t(), last_status_change: String.t(), breakdown: Breakdown.t() } defstruct [ :status, :last_status_change, :breakdown ] @impl true def cast(generic_map) do %__MODULE__{ status: generic_map["status"], last_status_change: generic_map["last_status_change"], breakdown: Castable.cast(Breakdown, generic_map["breakdown"]) } end end defmodule TransactionsUpdates do @moduledoc """ [Plaid institution transactions updates status schema.](https://plaid.com/docs/api/institutions/#institutions-get-response-transactions-updates) """ @behaviour Castable @type t :: %__MODULE__{ status: String.t(), last_status_change: String.t(), breakdown: Breakdown.t() } defstruct [ :status, :last_status_change, :breakdown ] @impl true def cast(generic_map) do %__MODULE__{ status: generic_map["status"], last_status_change: generic_map["last_status_change"], breakdown: Castable.cast(Breakdown, generic_map["breakdown"]) } end end @type t :: %__MODULE__{ auth: Auth.t(), balance: Balance.t(), health_incidents: [HealthIncident.t()] | nil, identity: Identity.t(), investments_updates: InvestmentsUpdates.t(), item_logins: ItemLogins.t(), transactions_updates: TransactionsUpdates.t() } defstruct [ :auth, :balance, :health_incidents, :identity, :investments_updates, :item_logins, :transactions_updates ] @impl true def cast(generic_map) do %__MODULE__{ auth: Castable.cast(Auth, generic_map["auth"]), balance: Castable.cast(Balance, generic_map["balance"]), health_incidents: Castable.cast_list(HealthIncident, generic_map["health_incidents"]), identity: Castable.cast(Identity, generic_map["identity"]), investments_updates: Castable.cast(InvestmentsUpdates, generic_map["investments_updates"]), item_logins: Castable.cast(ItemLogins, generic_map["item_logins"]), transactions_updates: Castable.cast(TransactionsUpdates, generic_map["transactions_updates"]) } end end