Yson.Schema (yson v0.2.2) View Source

Defines a Yson Schema that can be included in other schemas.

It is the base of high level schemas like Yson.GraphQL.Schema and Yson.Json.Schema, and contains useful macros to build up Schema description and resolvers tree.

defmodule Person do
  use Yson.Schema

  map :person do
    map :address do
      value(:street)
      value(:city)
    end
  end
end

Deep nesting is allowed but it is always possible to move a block outside and reference it with reference/2. The previous example could be changed as follows:

defmodule Person do
  use Yson.Schema

  map :person do
    reference(:address)
  end

  map :address do
    value(:street)
    value(:city)
  end
end

Link to this section Summary

Functions

Imports schema main types from another Yson.Schema module.

Defines a interface.

References a map or an interface by name.

Defines the root of the schema.

Defines a simple field.

Link to this section Functions

Link to this macro

import_schema(module_from)

View Source (macro)

Imports schema main types from another Yson.Schema module.

Examples

defmodule Address do
  use Yson.Schema

  map :address do
    value(:city)
  end
end

defmodule Person do
  use Yson.Schema

  import_schema(Address)

  map :person do
    reference(:address)
  end
end

Imported schema is not public. If a module imports Person schema and needs to refer :address explicitly, it will need to import Address too.

Link to this macro

interface(name, opts \\ [], list)

View Source (macro)

Defines a interface.

It contains virtual fields that will be automatically mapped on parent node as children. An interface field could be a value, a map, an interface or a reference.

Example

interface :address do
  value(:city)
end
Link to this macro

map(name, opts \\ [], list)

View Source (macro)

Defines a map.

A map field could be a value, a map, an interface or a reference.

Example

map :person do
  value(:name)
end

You can also specify custom resolver to parse data. It can be either a reference or an anonymous function.

Example

reverse_name = fn %{name: name} -> %{name: String.reverse(name)} end
map :person, resolver: &reverse_name/1 do
  value(:name)
end
Link to this macro

reference(reference, opts \\ [])

View Source (macro)

References a map or an interface by name.

The referenced map/interface should be defined outside the root/2 macro scope.

Example

map :any do
  reference(:referenced)
end

map :referenced do
  value(:name)
end

It is also possible to rename the referenced field:

Example

map :any do
  reference(:referenced, as: :my_field)
end

map :referenced do
  value(:name)
end
Link to this macro

root(opts \\ [], list)

View Source (macro)

Defines the root of the schema.

It contains the schema tree. A root field can be a value, a map, an interface or a reference.

Examples

root do
  value(:name)
end

You can also specify custom resolver to parse data. It can be either a reference or an anonymous function.

Example

reverse_name = fn %{name: name} -> %{name: String.reverse(name)} end
root resolver: &reverse_name/1 do
  value(:name)
end
Link to this macro

value(name, resolver \\ &identity/1)

View Source (macro)

Defines a simple field.

Example

value(:referenced)

You can also specify custom resolver to parse data. It can be either a reference or an anonymous function.

Example

value(:name, &String.reverse/1)