README.md

# TypedStructLegacyReflection

[![Build Status](https://travis-ci.com/ejpcmac/typed_struct_legacy_reflection.svg?branch=develop)](https://travis-ci.com/ejpcmac/typed_struct_legacy_reflection)
[![hex.pm version](http://img.shields.io/hexpm/v/typed_struct_legacy_reflection.svg?style=flat)](https://hex.pm/packages/typed_struct_legacy_reflection)

TypedStructLegacyReflection is a
[TypedStruct](https://github.com/ejpcmac/typed_struct) plugin defining the
reflection functions that used to be built-in before TypedStruct 0.2.0.

## Setup

To use this plugin in your project, add this to your Mix dependencies:

```elixir
{:typed_struct_legacy_reflection, "~> 1.0.0"}
```

If you do not plan to compile modules using this TypedStruct plugin at runtime,
you can add `runtime: false` to the dependency tuple as it is only used during
compilation.

## Usage

To use this plugin in a typed struct, simply register it in the `typedstruct`
block:

```elixir
defmodule StructWithReflection do
  use TypedStruct

  typedstruct do
    plugin TypedStructLegacyReflection

    field :a_field, term()
    field :another_field, String.t()
  end
end
```

Three functions are then defined in your typed struct, like TypedStruct did in
v0.1.x:

* `__keys__/0` - returns the keys of the struct
* `__defaults__/0` - returns the default value for each field
* `__types__/0` - returns the quoted type for each field

For instance:

```elixir
iex(1)> defmodule Demo do
...(1)>   use TypedStruct
...(1)>
...(1)>   typedstruct do
...(1)>     plugin TypedStructLegacyReflection
...(1)>
...(1)>     field :a_field, String.t()
...(1)>     field :with_default, integer(), default: 7
...(1)>   end
...(1)> end
{:module, Demo,
 <<70, 79, 82, 49, 0, 0, 8, 184, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 241,
   0, 0, 0, 24, 11, 69, 108, 105, 120, 105, 114, 46, 68, 101, 109, 111, 8, 95,
   95, 105, 110, 102, 111, 95, 95, 7, 99, ...>>,
 [{TypedStructLegacyReflection, []}]}
iex(2)> Demo.__keys__()
[:a_field, :with_default]
iex(3)> Demo.__defaults__()
[a_field: nil, with_default: 7]
iex(4)> Demo.__types__()
[
  a_field: {:|, [],
   [
     {{:., [line: 7],
       [{:__aliases__, [counter: {Demo, 3}, line: 7], [:String]}, :t]},
      [line: 7], []},
     nil
   ]},
  with_default: {:integer, [line: 8], []}
]
```

## [Contributing](CONTRIBUTING.md)

Before contributing to this project, please read the
[CONTRIBUTING.md](CONTRIBUTING.md).

## License

Copyright © 2018, 2020 Jean-Philippe Cugnet

This project is licensed under the [MIT license](LICENSE).