Skip to content

Instantly share code, notes, and snippets.

@andreapavoni
Forked from felipegasparini/README.md
Created November 23, 2016 12:05
Show Gist options
  • Save andreapavoni/1533d3953f5f5b792317b24401700f6a to your computer and use it in GitHub Desktop.
Save andreapavoni/1533d3953f5f5b792317b24401700f6a 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment