defmodule Slack.Team do @moduledoc ~S""" A Slack team. """ @typedoc @moduledoc @type t :: %__MODULE__{ id: String.t(), name: String.t(), domain: String.t() } @enforce_keys [ :id, :name, :domain ] defstruct @enforce_keys @doc ~S""" Parse Slack team. """ @spec parse(map) :: {:ok, t} | {:error, :team_missing_id | :team_missing_name | :team_missing_domain | :invalid_team} def parse(data = %{}) do id = MapX.get(data, :id) name = MapX.get(data, :name) domain = MapX.get(data, :domain) cond do is_nil(id) -> {:error, :team_missing_id} is_nil(name) -> {:error, :team_missing_name} is_nil(domain) -> {:error, :team_missing_domain} :valid -> {:ok, %__MODULE__{id: id, name: name, domain: domain}} end end def parse(_), do: {:error, :invalid_team} end