Current section
Files
Jump to
Current section
Files
lib/srd/content/armor.ex
defmodule Srd.Content.Armor do
@moduledoc """
An SRD armor.
"""
@categories ~w(light medium heavy shield)a
@enforce_keys [:slug, :name, :category, :base_ac]
defstruct [:slug, :name, :category, :base_ac, :strength, stealth_disadvantage: false]
@type category :: :light | :medium | :heavy | :shield
@typedoc """
An SRD armor:
* `:slug` - stable identifier used for lookup
* `:name` - display name
* `:category` - light, medium, heavy, or shield
* `:base_ac` - the base Armor Class (for a shield, the bonus it grants)
* `:strength` - the minimum Strength score the armor requires, or `nil`
* `:stealth_disadvantage` - whether wearing it gives disadvantage on Stealth
"""
@type t :: %__MODULE__{
slug: String.t(),
name: String.t(),
category: category(),
base_ac: non_neg_integer(),
strength: non_neg_integer() | nil,
stealth_disadvantage: boolean()
}
@doc false
@spec new(map()) :: t()
def new(data) do
%__MODULE__{
slug: data.slug,
name: data.name,
category: validate_category!(data.category),
base_ac: data.base_ac,
strength: data[:strength],
stealth_disadvantage: data[:stealth_disadvantage] || false
}
end
defp validate_category!(category) when category in @categories, do: category
defp validate_category!(category),
do: raise(ArgumentError, "unknown armor category: #{inspect(category)}")
end