defmodule ExCheckout.Item do
@moduledoc """
Defines a struct for storing an `Item` in a `Package`.
The `monetary_value` *might* be required depending on the origin/destination
countries of the shipment. Both `monetary_value` and `insurance` are integers
stored in USD cents.
"""
@enforce_keys [:description, :monetary_value, :weight, :quantity]
@fields ~w(description monetary_value weight quantity)a
defstruct @fields
@type t() :: %__MODULE__{
description: nil | String.t(),
monetary_value: nil | integer(),
weight: nil | number(),
quantity: nil | number()
}
@doc """
Builds and returns an `Item`. Use this instead of directly initializing the
struct.
"""
@spec new(map()) :: t()
def new(attrs) do
attrs = Map.take(attrs, @fields)
struct(__MODULE__, attrs)
end
end