diff --git a/lib/geef/oid.ex b/lib/geef/oid.ex new file mode 100644 index 0000000..d8cbdb4 --- /dev/null +++ b/lib/geef/oid.ex @@ -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 diff --git a/lib/geef/reference.ex b/lib/geef/reference.ex index 8bbd2b2..5d4a77a 100644 --- a/lib/geef/reference.ex +++ b/lib/geef/reference.ex @@ -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