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