Packages

Extends Ecto schemas with Swagger definitons

Current section

Files

Jump to
ecto_swagger lib swagger_ecto schema.ex
Raw

lib/swagger_ecto/schema.ex

defmodule SwaggerEcto.Schema do
@moduledoc """
Schema definition for Ecto and Swagger
"""
@doc false
defmacro __using__(_opts) do
quote do
use Ecto.Schema
import SwaggerEcto.Schema
end
end
@doc """
Defines and Ecto schema
"""
defmacro swagger_schema(source, block) do
quote do
Ecto.Schema.schema unquote(source), unquote(block)
SwaggerEcto.Schema.schema unquote(source), unquote(block)
end
end
defmacro swagger_embedded_schema(source, block) do
quote do
Ecto.Schema.embedded_schema unquote(block)
SwaggerEcto.Schema.embedded_schema unquote(source), unquote(block)
end
end
@doc false
defmacro schema(source, block) do
exprs =
case block do
[do: {:__block__, _, exprs}] -> exprs
[do: expr] when is_tuple(expr) -> [expr]
end
schema = SwaggerEcto.Helpers.create_schema(source, exprs)
escaped = Macro.escape(schema)
quote do
{id, type, opts} = Module.get_attribute(__MODULE__, :primary_key)
@primary_key_field id
@primary_key_type type
@primary_key_opts opts
def __schema__(:swagger) do
schema = unquote(escaped)
id_type = if @primary_key_type == :id, do: :integer, else: :string
%{schema |
required: [@primary_key_field | schema.required],
properties: Map.merge(schema.properties, %{
@primary_key_field => %{
type: id_type
}
})
}
|> PhoenixSwagger.to_json
end
end
end
@doc false
defmacro embedded_schema(source, block) do
exprs =
case block do
[do: {:__block__, _, exprs}] -> exprs
[do: expr] when is_tuple(expr) -> [expr]
end
schema = SwaggerEcto.Helpers.create_schema(source, exprs)
escaped = Macro.escape(schema)
quote do
def __schema__(:swagger) do
schema = unquote(escaped)
PhoenixSwagger.to_json(schema)
end
end
end
end