rdf-ex/lib/rdf/serializations/nquads_decoder.ex

37 lines
1.1 KiB
Elixir
Raw Normal View History

2017-04-11 00:09:35 +00:00
defmodule RDF.NQuads.Decoder do
@moduledoc false
2017-04-11 00:09:35 +00:00
use RDF.Serialization.Decoder
import RDF.Serialization.ParseHelper, only: [error_description: 1]
2020-03-10 00:37:53 +00:00
alias RDF.{Dataset, Graph}
2018-09-17 00:08:16 +00:00
@impl RDF.Serialization.Decoder
2020-06-29 08:37:42 +00:00
@spec decode(String.t(), keyword | map) :: {:ok, Graph.t() | Dataset.t()} | {:error, any}
2017-04-11 00:09:35 +00:00
def decode(content, _opts \\ []) do
with {:ok, tokens, _} <- tokenize(content),
2020-06-29 08:37:42 +00:00
{:ok, ast} <- parse(tokens) do
2017-04-11 00:09:35 +00:00
{:ok, build_dataset(ast)}
else
{:error, {error_line, :ntriples_lexer, error_descriptor}, _error_line_again} ->
2020-06-29 08:37:42 +00:00
{:error,
"N-Quad scanner error on line #{error_line}: #{error_description(error_descriptor)}"}
2017-04-11 00:09:35 +00:00
{:error, {error_line, :nquads_parser, error_descriptor}} ->
2020-06-29 08:37:42 +00:00
{:error,
"N-Quad parser error on line #{error_line}: #{error_description(error_descriptor)}"}
2017-04-11 00:09:35 +00:00
end
end
2020-06-29 08:37:42 +00:00
defp tokenize(content), do: content |> to_charlist |> :ntriples_lexer.string()
2017-04-11 00:09:35 +00:00
2020-06-29 08:37:42 +00:00
defp parse(tokens), do: tokens |> :nquads_parser.parse()
2017-04-11 00:09:35 +00:00
defp build_dataset(ast) do
2020-06-29 08:37:42 +00:00
Enum.reduce(ast, RDF.Dataset.new(), fn quad, dataset ->
2017-04-11 00:09:35 +00:00
RDF.Dataset.add(dataset, quad)
2020-06-29 08:37:42 +00:00
end)
2017-04-11 00:09:35 +00:00
end
end