# `JSCalendar.Participant`
[🔗](https://github.com/elixir-tempo/jscalendar/blob/v0.1.0/lib/jscalendar/parts.ex#L188)

Someone or something involved in the object
([RFC 8984 §4.4.6](https://www.rfc-editor.org/rfc/rfc8984.html#section-4.4.6)).

A participant is not only a person: `kind` may be `location` or
`resource`, which is how a room or a projector joins a meeting.
`roles` is mandatory and is a set, because one participant is
routinely both `attendee` and `chair`.

The three `progress` properties apply only when the participant is
taking part in a `JSCalendar.Task`.

# `t`

```elixir
@type t() :: %JSCalendar.Participant{
  delegated_from: term(),
  delegated_to: term(),
  description: term(),
  email: String.t() | nil,
  expect_reply: boolean(),
  extra: map(),
  invited_by: term(),
  kind: String.t() | nil,
  language: term(),
  links: term(),
  location_id: term(),
  member_of: term(),
  name: String.t() | nil,
  participation_comment: term(),
  participation_status: String.t(),
  percent_complete: term(),
  progress: term(),
  progress_updated: term(),
  roles: MapSet.t() | nil,
  schedule_agent: term(),
  schedule_force_send: term(),
  schedule_sequence: term(),
  schedule_status: term(),
  schedule_updated: term(),
  send_to: term(),
  sent_by: term()
}
```

# `from_map`

```elixir
@spec from_map(map()) :: {:ok, struct()} | {:error, term()}
```

Read this object from a decoded JSON map.

### Arguments

* `map` is a map with string keys, as `:json.decode/1` returns.

### Returns

* `{:ok, object}`; or

* `{:error, reason}` when a property does not match its declared
  type.

# `jscalendar_type`

```elixir
@spec jscalendar_type() :: String.t()
```

The `@type` value RFC 8984 gives this object.

### Returns

* the type name as a string.

# `to_map`

```elixir
@spec to_map(struct()) :: map()
```

Write this object back to a JSON-ready map.

### Arguments

* `object` is a `t:t/0`.

### Returns

* a map with string keys, ready for `:json.encode/1`.

---

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