lib/ex_teal/place.ex

defmodule ExTeal.Place do
  @moduledoc """
  The core struct that represents and validates an address
  """

  use Ecto.Schema
  import Ecto.Changeset

  alias Ecto.Changeset
  alias ExTeal.Place

  @serialized ~w(company address address_line_2 city state zip country)a
  @derive {Jason.Encoder, only: @serialized}

  @type t :: %__MODULE__{}

  embedded_schema do
    field(:company, :string)
    field(:address, :string)
    field(:address_line_2, :string)
    field(:city, :string)
    field(:state, :string)
    field(:zip, :string)
    field(:country, :string)
  end

  @fields ~w(address city state zip country address_line_2 company)a

  @required_fields ~w(address city state zip country)a

  @spec changeset(Place.t(), map()) :: Changeset.t()
  def changeset(place, params \\ %{}) do
    place
    |> cast(params, @fields)
    |> validate_required(@required_fields)
  end
end