a cabal implementation in erlang
-module(examples).

-export([
    post_request/0,
    cancel_request/0,
    channel_time_range_request/0,
    channel_state_request/0,
    channel_list_request/0,
    hash_response/0,
    post_response/0,
    channel_list_response/0,
    post_text/0,
    post_delete/0,
    post_info/0,
    post_topic/0,
    post_join/0,
    post_leave/0
]).

post_request() ->
    {ok, D} = unpack_data(2),
    %% assert the json is still formatted as expected
    <<"post request">> = proplists:get_value(name, D),
    D.

cancel_request() ->
    {ok, D} = unpack_data(3),
    <<"cancel request">> = proplists:get_value(name, D),
    D.

channel_time_range_request() ->
    {ok, D} = unpack_data(4),
    <<"channel time range request">> = proplists:get_value(name, D),
    D.

channel_state_request() ->
    {ok, D} = unpack_data(5),
    <<"channel state request">> = proplists:get_value(name, D),
    D.

channel_list_request() ->
    {ok, D} = unpack_data(6),
    <<"channel list request">> = proplists:get_value(name, D),
    D.

%% TODO: moderation_state_request = 7

hash_response() ->
    {ok, D} = unpack_data(8),
    <<"hash response">> = proplists:get_value(name, D),
    D.

post_response() ->
    {ok, D} = unpack_data(9),
    <<"post response">> = proplists:get_value(name, D),
    D.

channel_list_response() ->
    {ok, D} = unpack_data(10),
    <<"channel list response">> = proplists:get_value(name, D),
    D.

post_text() ->
    {ok, D} = unpack_data(11),
    <<"post/text">> = proplists:get_value(name, D),
    D.

post_delete() ->
    {ok, D} = unpack_data(12),
    <<"post/delete">> = proplists:get_value(name, D),
    D.

post_info() ->
    {ok, D} = unpack_data(13),
    <<"post/info">> = proplists:get_value(name, D),
    D.

post_topic() ->
    {ok, D} = unpack_data(14),
    <<"post/topic">> = proplists:get_value(name, D),
    D.

post_join() ->
    {ok, D} = unpack_data(15),
    <<"post/join">> = proplists:get_value(name, D),
    D.

post_leave() ->
    {ok, D} = unpack_data(16),
    <<"post/leave">> = proplists:get_value(name, D),
    D.

%% TODO:
%% "post/role"
%% "post/moderation"
%% "post/block"
%% "post/unblock"

% json helper
% ===========

%% Load JSON data into persistent_term
load() ->
    case file:read_file("cable-examples.json") of
        {ok, Binary} ->
            try
                Json = jsone:decode(Binary),
                persistent_term:put(json_data, Json),
                {ok, Json}
            catch
                _:Error -> {error, Error}
            end;
        {error, Reason} ->
            {error, Reason}
    end.

%% Retrieve JSON data from persistent_term
get_data(Index) ->
    {ok, J} =
        case persistent_term:get(json_data, undefined) of
            undefined -> load();
            Json -> {ok, Json}
        end,
    {ok, lists:nth(Index, J)}.

unpack_data(Index) ->
    {ok, J} = get_data(Index),
    #{<<"binary">> := Bin, <<"obj">> := Obj, <<"name">> := Name} = J,
    {ok, [
        {name, Name},
        {binary, hex:hexstr_to_bin(binary_to_list(Bin))},
        {obj, Obj}
    ]}.