rdf-ex/lib/rdf/serialization/encoder.ex

46 lines
1.3 KiB
Elixir
Raw Normal View History

defmodule RDF.Serialization.Encoder do
@moduledoc """
A behaviour for encoders of `RDF.Graph`s or `RDF.Dataset`s in a specific
`RDF.Serialization` format.
"""
2020-03-10 00:37:53 +00:00
alias RDF.{Dataset, Graph}
@doc """
Encodes a `RDF.Graph` or `RDF.Dataset`.
It returns an `{:ok, string}` tuple, with `string` being the serialized
`RDF.Graph` or `RDF.Dataset`, or `{:error, reason}` if an error occurs.
"""
2020-06-29 08:37:42 +00:00
@callback encode(Graph.t() | Dataset.t(), keyword | map) :: {:ok, String.t()} | {:error, any}
@doc """
Encodes a `RDF.Graph` or `RDF.Dataset`.
As opposed to `encode`, it raises an exception if an error occurs.
Note: The `__using__` macro automatically provides an overridable default
implementation based on the non-bang `encode` function.
"""
2020-06-29 08:37:42 +00:00
@callback encode!(Graph.t() | Dataset.t(), keyword | map) :: String.t()
defmacro __using__(_) do
quote bind_quoted: [], unquote: true do
@behaviour unquote(__MODULE__)
2018-09-17 00:08:16 +00:00
@impl unquote(__MODULE__)
2020-03-10 00:37:53 +00:00
@dialyzer {:nowarn_function, encode!: 2}
2020-06-29 08:37:42 +00:00
@spec encode!(Graph.t() | Dataset.t(), keyword) :: String.t()
def encode!(data, opts \\ []) do
case encode(data, opts) do
2020-06-29 08:37:42 +00:00
{:ok, data} -> data
{:error, reason} -> raise reason
end
end
2020-06-29 08:37:42 +00:00
defoverridable encode!: 1
defoverridable encode!: 2
end
end
end