# `RaftedValue.Config`
[🔗](https://github.com/skirino/rafted_value/blob/main/lib/rafted_value/type.ex#L3)

# `t`

```elixir
@type t() :: %RaftedValue.Config{
  communication_module: Croma.Atom.t(),
  data_module: Croma.Atom.t(),
  election_timeout: Croma.PosInteger.t(),
  election_timeout_clock_drift_margin: Croma.PosInteger.t(),
  heartbeat_timeout: Croma.PosInteger.t(),
  leader_hook_module: Croma.Atom.t(),
  max_retained_command_results: Croma.PosInteger.t()
}
```

# `communication_module`

```elixir
@spec communication_module(t()) :: Croma.Atom.t()
```

Type-aware getter for communication_module.

# `communication_module`

```elixir
@spec communication_module(t(), Croma.Atom.t()) :: t()
```

Type-aware setter for communication_module.

# `data_module`

```elixir
@spec data_module(t()) :: Croma.Atom.t()
```

Type-aware getter for data_module.

# `data_module`

```elixir
@spec data_module(t(), Croma.Atom.t()) :: t()
```

Type-aware setter for data_module.

# `election_timeout`

```elixir
@spec election_timeout(t()) :: Croma.PosInteger.t()
```

Type-aware getter for election_timeout.

# `election_timeout`

```elixir
@spec election_timeout(t(), Croma.PosInteger.t()) :: t()
```

Type-aware setter for election_timeout.

# `election_timeout_clock_drift_margin`

```elixir
@spec election_timeout_clock_drift_margin(t()) :: Croma.PosInteger.t()
```

Type-aware getter for election_timeout_clock_drift_margin.

# `election_timeout_clock_drift_margin`

```elixir
@spec election_timeout_clock_drift_margin(t(), Croma.PosInteger.t()) :: t()
```

Type-aware setter for election_timeout_clock_drift_margin.

# `heartbeat_timeout`

```elixir
@spec heartbeat_timeout(t()) :: Croma.PosInteger.t()
```

Type-aware getter for heartbeat_timeout.

# `heartbeat_timeout`

```elixir
@spec heartbeat_timeout(t(), Croma.PosInteger.t()) :: t()
```

Type-aware setter for heartbeat_timeout.

# `leader_hook_module`

```elixir
@spec leader_hook_module(t()) :: Croma.Atom.t()
```

Type-aware getter for leader_hook_module.

# `leader_hook_module`

```elixir
@spec leader_hook_module(t(), Croma.Atom.t()) :: t()
```

Type-aware setter for leader_hook_module.

# `max_retained_command_results`

```elixir
@spec max_retained_command_results(t()) :: Croma.PosInteger.t()
```

Type-aware getter for max_retained_command_results.

# `max_retained_command_results`

```elixir
@spec max_retained_command_results(t(), Croma.PosInteger.t()) :: t()
```

Type-aware setter for max_retained_command_results.

# `new`

```elixir
@spec new(term()) :: Croma.Result.t(t())
```

Creates a new instance of RaftedValue.Config by using the given `dict`.

Values associated with the struct field names are fetched from the given `dict`
and then validated/converted with `valid?/1`/`new/1`.
For missing fields default values (if any) are used.

Returns `{:ok, valid_struct}` when all fields are filled with valid values.
Returns `{:error, reason}` if any error occurs (invalid value or no value is available).

See also moduledoc of `Croma.Struct`.

# `new!`

```elixir
@spec new!(term()) :: t()
```

A variant of `new/1` which returns `t` or raise if validation fails.

In other words, `new/1` followed by `Croma.Result.get!/1`.

# `update`

```elixir
@spec update(t(), Dict.t()) :: Croma.Result.t(t())
```

Updates an existing instance of RaftedValue.Config with the given `dict`.
The values in the `dict` are validated by each field's `valid?/1` function.
Returns `{:ok, valid_struct}` or `{:error, reason}`.

# `update!`

```elixir
@spec update!(t(), Dict.t()) :: t()
```

A variant of `update/2` which returns `t` or raise if validation fails.
In other words, `update/2` followed by `Croma.Result.get!/1`.

# `valid?`

```elixir
@spec valid?(term()) :: boolean()
```

Checks if the given value belongs to `t:t/0` or not.

---

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