alavrik / erlson

Erlang Simple Object Notation - dynamic name-value dictionary data type and syntax for Erlang
MIT License
81 stars 17 forks source link

Build Status

Erlson - Erlang Simple Object Notation

Erlson is a dynamic name-value dictionary data type for Erlang.

Erlson dictionaries come with a convenient syntax and can be directly converted to and from JSON.

Examples:

    % create an empty dictionary
    X = #[],

    % associate fields 'foo' with 1, 'bar' with "abc" and 'fum' with 'true'
    D = #[foo = 1, bar = "abc", fum],

    % access dictionary element
    1 = D.foo,

    % add nested dictionaries to dictionary D
    D1 = D#[baz = #[fum = #[i = 0]]],

    % access elements of the nested dictionary
    0 = D1.baz.fum.i,

    % modify elements of the nested dictionary
    D2 = D1#[baz.fum.i = 100, baz.fum.j = "new nested value"].

    ...

    % convert Erlson dictionary to JSON iolist()
    erlson:to_json(D2).

    % create Erlson dictionary from JSON iolist()
    D = erlson:from_json(Json).

    ...

    % create Erlson dictionary from a proplist
    D = erlson:from_proplist(L).

    % create nested Erlson dictionary from a nested proplist
    D = erlson:from_nested_proplist(L).

    % create nested Erlson dictionary from a nested proplist up to the maximum
    % depth of 2
    D = erlson:from_nested_proplist(L, 2).

Other API functions

Parsing and generating top-level JSON arrays.

ErlsonList = erlson:list_from_json_array(<JSON array represented as iolist()>)

JsonArray = erlson:list_to_json_array(ErlsonList)

Accessing fields dynamically (i.e. without using Erlson syntax). The main difference between Erlson field access syntax and get_value/1 is that get_value/1 returns undefined if the field is missing whereas Erlson will crash.

erlson:get_value(Path, Dict)  % alias for get_value(Path, 'undefined')

erlson:get_value(Path, Dict, Default)

% Path :: atom() | [atom()]

Macros similar to get_value/2,3 functions for gracefully handling missing fields but still using Erlson syntax for accessing them. Example:

-include_lib("erlson/include/erlson.hrl").

...

?erlson_default(X.foo.bar)

?erlson_default(X.foo.bar, Default)

General properties

Runtime properties

Erlson and JSON

Erlson and property lists

Property list can be converted to Erlson dictionaries using the erlson:from_proplist function and its variations.

Erlson dictionaries can also be used for property lists construction. Using Erlson, proplists look much cleaner. For example, compare

{application, erlson,
 [{description, "Erlang Simple Object Notation"},
  {vsn, git},
  {modules, []},
  {applications, [kernel, stdlib]},
  {env, []}]}.

and

{application, erlson,
 #[description = "Erlang Simple Object Notation",
   vsn = git,
   modules = [],
   applications = [kernel, stdlib],
   env = []]].

Usage instructions

For compiled modules that use Erlson syntax, the Erlson library header must be included:

    -include_lib("erlson/include/erlson.hrl").

When rebar is used as a build tool, it should be configured to use "erlson_rebar_plugin". In order to do that, add the following lines to the project's "rebar.config" file:

    {plugins, [erlson_rebar_plugin]}. % for newer rebar
    {rebar_plugins, [erlson_rebar_plugin]}. % for older rebar

    {deps,
        [
            {erlson, "", {git, "https://github.com/alavrik/erlson.git", {branch, "master"}}}
        ]}.

In order to use Erlson syntax from Erlang shell, run the following command (e.g. include it in .erlang file):

    erlson:init().

Erlang compatibility

Erlson relies on modified versions of Erlang parsers taken from correspondent Erlang/OTP releases. While Erlson is fully compatible with R13, R14, R15, R16, R17 Erlang releases, compatibility between Erlson and future Erlang versions can not be guaranteed.

Compatibility can break if future Erlang versions introduces new unrelated syntax elements conflicting with Erlson grammar which will make Erlson completely unusable in its current form. In response to that, Erlson may adjust its grammar to remain compatible.

Dependencies

Erlson relies on mochijson2 library for JSON encoding and decoding. It comes as a part of Mochiweb. Erlson doesn't automatically include it, but if you wish to do it with a rebar-enabled project, add it as dependency in your rebar.config. For example:

    {deps,
        [
            % we need Mochiweb for mochijson2
            {mochiweb, "", {git, "https://github.com/mochi/mochiweb.git", {branch, "master"}}}
        ]}.

Authors

Erlson is created by Anton Lavrik alavrik@piqi.org.

License

Erlson is distributed under the terms of a MIT license. See the LICENSE file for details.