Packages
avrora
0.9.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.2
0.24.1
0.24.0
0.23.0
0.22.0
0.21.1
0.21.0
0.20.0
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.0
0.14.1
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.1-beta
0.1.0-beta
An Elixir library for working with Avro messages conveniently. It supports local schema files and Confluent® schema registry.
Current section
Files
Jump to
Current section
Files
lib/avrora/storage/file.ex
defmodule Avrora.Storage.File do
@moduledoc """
`Avora.Storage` behavior implementation which uses the filesystem.
Schema name `<namespace>.<namespace>.<name>` will be stored to path
`namespace/namespace/name.avsc`.
"""
require Logger
alias Avrora.{Config, Schema}
alias Avrora.Schema.Name
@behaviour Avrora.Storage
@extension ".avsc"
@doc """
Read schema from disk by full name, including namespace.
Files are stored with each namespace component as a folder name.
For example `io.confluent.Payment` should be stored as follows:
.
├── lib/
├── priv/
│ ├── ...
│ └── schemas/
│ └── io/
│ └── confluent/
│ └── Payment.avsc
└── ...
## Examples
iex> {:ok, schema} = Avrora.Storage.File.get("io.confluent.examples.Payment")
iex> schema.full_name
"io.confluent.Payment"
"""
def get(key) when is_binary(key) do
with {:ok, body} <- read_schema_file_by_name(key),
do: Schema.parse(body, &read_schema_file_by_name/1)
end
@doc false
def get(key) when is_integer(key), do: {:error, :unsupported}
@doc false
def put(_key, _value), do: {:error, :unsupported}
defp read_schema_file_by_name(name) do
with {:ok, schema_name} <- Name.parse(name),
filepath <- name_to_filepath(schema_name.name) do
unless is_nil(schema_name.version) do
Logger.warn(
"reading schema file with version is not allowed, `#{schema_name.name}` used instead"
)
end
Logger.debug("reading schema `#{schema_name.name}` from the file #{filepath}")
File.read(filepath)
end
end
defp name_to_filepath(name) do
filename = String.replace(name, ".", "/") <> @extension
Path.join(schemas_path(), filename)
end
defp schemas_path, do: Config.schemas_path()
end