README.md

rekt
=====

Erlang Record Extender Parse Transform

Build
-----

    $ rebar3 compile

Usage
-----

1) Add `rekt` to your rebar dependencies

2) Include in your modules(if using with Nitrogen 2.4+, it's included by default):

`-compile({parse_transform, rekt}).`

3) Extend records:

```erlang
-extend({original_record, new_record, [
	field1,   %% Just an atom for a field,
    {field2, 2},    %% A field with a default value of 2
    {field3, [a,b,c]},  %% a field with a default value of [a,b,c],
	{field4, "sometext", "string() | undefined"} %% A field with a default value of
                                                 %% "sometext", and supports types
                                                 %% string() and undefined. Note,
                                                 %% the typedef is the string
                                                 %% of the typedef
]}).
```

4) Enjoy being able to create new records from older records.

Notes
-----

* You can replace fields with new field definitions. The fields will be replaced
in-line.
* You can extend previously extended records.

Example
-------
```erlang
-module(rekt_sample).
-compile({parse_transform, rekt}).
-export([do/0]).

%% Create initial record
-record(rec_1, {a=1, b=2, c=3}).

%% Make new record called #rec_2{}, that is a copy of #rec_1{} with a new field called `y`
-extend({rec_1, rec_2, [
	{y, 1000}
]}).

%% Make a new record called #rec_3{} based on the previously created #rec_2{},
%% with the `a` field replaced with a new definition (having a default value of
%% "newthing")
-extend({rec_2, rec_3, [
	{a, "newthing"}
]}).

do() ->
	io:format("Rec_1: ~p~n",[#rec_1{}]),
	io:format("Rec_2: ~p~n",[#rec_2{}]),
	io:format("Rec_3: ~p~n",[#rec_3{}]).
```

Then run:

```erlang
> rekt_sample:do().
Rec_1: {rec_1, 1, 2, 3}
Rec_2: {rec_2, 1, 2, 3, 1000}
Rec_3: {rec_3, "newthing", 2, 3, 1000}
ok
```

License
-------
Copyright 2017-2020 Jesse Gumm

MIT LICENSE