https://github.com/nitrogen/rekt
Erlang Record Extender (parse transform)
https://github.com/nitrogen/rekt
Last synced: 4 months ago
JSON representation
Erlang Record Extender (parse transform)
- Host: GitHub
- URL: https://github.com/nitrogen/rekt
- Owner: nitrogen
- License: other
- Created: 2017-02-01T21:47:20.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2021-01-13T14:38:55.000Z (over 5 years ago)
- Last Synced: 2025-04-29T22:36:32.472Z (about 1 year ago)
- Language: Erlang
- Homepage:
- Size: 856 KB
- Stars: 8
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
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