Skip to content

Instantly share code, notes, and snippets.

@santosh-suresh
Forked from felipegasparini/README.md
Created November 15, 2016 17:19
Show Gist options
  • Save santosh-suresh/3ff37013b834030a874b03625c064bcb to your computer and use it in GitHub Desktop.
Save santosh-suresh/3ff37013b834030a874b03625c064bcb to your computer and use it in GitHub Desktop.
Ecto Postgres tsrange data type
defmodule Postgrex.Extension.TSRange do
@behaviour Ecto.Type
def type, do: :tsrange
def cast([lower, upper]) do
case apply_func([lower, upper], &Ecto.DateTime.cast/1) do
{:ok, [lower, upper]} -> {:ok, [lower, upper]}
:error -> :error
end
end
def cast(_), do: :error
def load(%Postgrex.Range{lower: lower, upper: upper}) do
apply_func([lower, upper], &Ecto.DateTime.load/1)
end
def load(_), do: :error
def dump([lower, upper]) do
case apply_func([lower, upper], &Ecto.DateTime.dump/1) do
{:ok, [lower, upper]} -> {:ok, %Postgrex.Range{lower: lower, upper: upper, upper_inclusive: false}}
:error -> :error
end
end
def dump(_), do: :error
defp to_float(value) do
value |> Decimal.to_string |> Float.parse
end
defp apply_func([lower, upper], fun) do
lower = apply_func(lower, fun)
upper = apply_func(upper, fun)
if lower != :error and upper != :error do
{:ok, [lower, upper]}
else
:error
end
end
defp apply_func(target, fun) do
case fun.(target) do
{:ok, target} -> target
:error -> :error
end
end
end
@voughtdq
Copy link

Thank you so much for making this. I was pulling my hair out trying to create an implementation of TSRange that worked. You rock.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment