Introduce an elixir OID type

This is still fairly experimental.
This commit is contained in:
Carlos Martín Nieto
2013-09-02 20:10:56 +02:00
parent 895041b2a7
commit a400d3ca85
2 changed files with 43 additions and 6 deletions

31
lib/geef/oid.ex Normal file
View File

@@ -0,0 +1,31 @@
defrecord Geef.Oid, Record.extract(:geef_oid, from: "src/geef_records.hrl") do
alias Geef.Oid
@doc false
defmacro to_erl(oid) do
quote do
set_elem(unquote(oid), 0, :geef_oid)
end
end
@doc false
defmacro from_erl(oid) do
quote do
set_elem(unquote(oid), 0, Geef.Oid)
end
end
defp maybe_oid({:ok, oid}), do: from_erl(oid)
defp maybe_oid(error = {:error, _}), do: error
@spec parse(iolist) :: t
def parse(str) do
:geef_oid.parse(str)
end
@spec hex(t) :: String.t
def hex(oid = Oid[]) do
:geef_oid.hex(to_erl(oid))
end
end

View File

@@ -1,15 +1,21 @@
defrecord Geef.Reference, Record.extract(:geef_reference, from: "src/geef_records.hrl") do
import Geef
alias Geef.Reference
alias Geef.Oid
import Oid, only: :macros
defmacrop rebind(obj) do
quote do
set_elem(unquote(obj), 0, :geef_reference)
def from_erl(ref) do
case set_elem(ref, 0, Geef.Reference) do
ref = Reference[type: :symbolic] -> ref
ref = Reference[type: :oid, target: oid] -> ref.target(set_elem(oid, 0, Geef.Oid))
end
end
def from_erl(ref) do
set_elem(ref, 0, Geef.Reference)
def to_erl(ref = Reference[type: :symbolic]) do
set_elem(ref, 0, :geef_reference)
end
def to_erl(ref = Reference[type: :oid, target: oid]) do
ref |> set_elem(0, :geef_reference) |> set_elem(4, set_elem(oid, 0, :geef_oid))
end
defp maybe_ref({:ok, ref}), do: {:ok, Reference.from_erl ref}
@@ -18,7 +24,7 @@ defrecord Geef.Reference, Record.extract(:geef_reference, from: "src/geef_record
def lookup(repo, name), do: :geef_ref.lookup(repo, name) |> maybe_ref
def lookup!(repo, name), do: lookup(repo, name) |> assert_ok
def resolve(ref = Reference[]), do: :geef_ref.resolve(rebind(ref)) |> maybe_ref
def resolve(ref = Reference[]), do: :geef_ref.resolve(to_erl(ref)) |> maybe_ref
def resolve!(ref =Reference[]), do: resolve(ref) |> assert_ok
def dwim(repo, name), do: :geef_ref.dwim(repo, name) |> maybe_ref