# `Ltix.MembershipsService.Member`
[🔗](https://github.com/DecoyLex/ltix/blob/main/lib/ltix/memberships_service/member.ex#L1)

A single member in a roster response from the memberships service.

Each member has a `user_id` (matching `sub` from launch JWTs) and
`roles` (parsed into `%Role{}` structs). Additional fields like
`name`, `email`, and `picture` depend on platform consent.

## Examples

    {:ok, member} = Ltix.MembershipsService.Member.from_json(%{
      "user_id" => "user-1",
      "roles" => ["http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"],
      "name" => "Jane Doe",
      "email" => "jane@example.edu"
    })

    member.user_id
    #=> "user-1"

    member.name
    #=> "Jane Doe"

    hd(member.roles).name
    #=> :learner

# `t`

```elixir
@type t() :: %Ltix.MembershipsService.Member{
  email: String.t() | nil,
  family_name: String.t() | nil,
  given_name: String.t() | nil,
  lis_person_sourcedid: String.t() | nil,
  lti11_legacy_user_id: String.t() | nil,
  message: [Ltix.LaunchClaims.t()] | nil,
  middle_name: String.t() | nil,
  name: String.t() | nil,
  picture: String.t() | nil,
  roles: [Ltix.LaunchClaims.Role.t()],
  status: :active | :inactive | :deleted,
  unrecognized_roles: [String.t()],
  user_id: String.t()
}
```

# `from_json`

```elixir
@spec from_json(map()) :: {:ok, t()} | {:error, Exception.t()}
```

Parse a member from a JSON map in a membership container response.

Returns `{:ok, member}` on success or `{:error, exception}` if
required fields are missing or invalid.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
