Packages
tz_extra
0.41.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.1
0.22.0
0.21.1
0.21.0
0.20.1
0.20.0
0.17.0
0.16.7
0.16.6
0.16.5
0.16.3
0.16.2
0.16.1
0.16.0
0.15.1
0.15.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Time zone-related utilities
Current section
Files
Jump to
Current section
Files
lib/changeset.ex
if Code.ensure_loaded?(Ecto.Changeset) do
defmodule TzExtra.Changeset do
require TzExtra.Compiler
def validate_time_zone_id(%Ecto.Changeset{} = changeset, field, opts \\ [])
when is_atom(field) do
opts =
opts
|> Keyword.put(:include_aliases, Keyword.get(opts, :allow_alias, false))
Ecto.Changeset.validate_change(changeset, field, :time_zone_id, fn _field, value ->
if Enum.member?(TzExtra.time_zone_ids(opts), value),
do: [],
else: [
{field, {message(opts, "is not a valid time zone"), [validation: :time_zone_id]}}
]
end)
end
def validate_civil_time_zone_id(%Ecto.Changeset{} = changeset, field, opts \\ [])
when is_atom(field) do
opts =
opts
|> Keyword.put(:include_aliases, Keyword.get(opts, :allow_alias, false))
Ecto.Changeset.validate_change(changeset, field, :civil_time_zone_id, fn _field, value ->
if Enum.member?(TzExtra.civil_time_zone_ids(opts), value),
do: [],
else: [
{field,
{message(opts, "is not a valid time zone"), [validation: :civil_time_zone_id]}}
]
end)
end
def validate_iso_country_code(%Ecto.Changeset{} = changeset, field, opts \\ [])
when is_atom(field) do
Ecto.Changeset.validate_change(changeset, field, :iso_country_code, fn _field, value ->
if Enum.any?(TzExtra.countries(), fn %{code: country_code} -> country_code == value end),
do: [],
else: [
{field,
{message(opts, "is not a valid country code"), [validation: :iso_country_code]}}
]
end)
end
def validate_country_time_zone(%Ecto.Changeset{} = changeset, fields, opts \\ []) do
field_names = Keyword.keys(fields)
field_types = Keyword.values(fields)
unless [:country_code, :time_zone_id] -- field_types == [] do
raise "second argument must be a keyword list where the values are :country_code and :time_zone_id"
end
ChangesetHelpers.validate_changes(changeset, field_names, :country_time_zone, fn fields ->
[{field_name_1, field_value_1}, {_field_name_2, field_value_2}] = fields
{country_code, time_zone_id} =
cond do
Keyword.fetch!(fields, field_name_1) == :country_code ->
{field_value_1, field_value_2}
true ->
{field_value_2, field_value_1}
end
case TzExtra.country_time_zone(country_code, time_zone_id) do
{:ok, _} ->
[]
{:error, _} ->
[
{field_name_1,
{message(opts, "is not a valid country time zone"),
[validation: :country_time_zone]}}
]
end
end)
end
defp message(opts, key \\ :message, default) do
Keyword.get(opts, key, default)
end
end
end