REST: framework with typed JSON =============================== Usage ----- Just plug REST endpoint directly to your Cowboy router: ```erlang {"/rest/:resource", rest_cowboy, []}, {"/rest/:resource/:id", rest_cowboy, []}, ``` Emakefile ``` {["deps/jsone/src/*"], [{outdir, "deps/ebin"}]}. {["deps/rest/src/rest.erl", "deps/rest/src/*"], [{outdir, "deps/ebin"}]}. ``` Module ------ Sample REST service implementation: ```erlang -module(rest_users). -compile({parse_transform, rest}). -export([init/0, populate/1, new/0, exists/1, get/0, get/1, post/1, delete/1]). -export([keys_allowed/1]). -record(user, {id, cn, name, type}). -rest_record(user). keys_allowed(Keys) -> Allow = [<<"id">>, <<"test">>], lists:all(fun(X) -> lists:member(X, Allow) end, Keys). new() -> #user{}. init() -> ets:new(rest_users, [public, named_table, {keypos, #user.id}]). populate(Users) -> ets:insert(rest_users, Users). exists(Id) -> X = ets:member(rest_users, erlang:binary_to_list(Id)), io:format("Member: ~p~n", [X]), X. get() -> ets:tab2list(rest_users). get(Id) -> [U] = ets:lookup(rest_users, erlang:binary_to_list(Id)), io:format("User: ~p~n", [U]), U. delete(Id) -> ets:delete(rest_users, erlang:binary_to_list(Id)). post(#user{} = User) -> ets:insert(rest_users, User); post(Data) -> post(from_json(Data, #user{})). ``` Usage ----- ``` curl -i -X POST -d "id=vlad" localhost:4000/rest/rest_users curl -i -X POST -d "id=doxtop" localhost:4000/rest/rest_users curl -i -X GET localhost:4000/rest/rest_users curl -i -X PUT -d "id=5HT" localhost:4000/rest/rest_users/vlad curl -i -X GET localhost:4000/rest/rest_users/5HT curl -i -X DELETE localhost:4000/rest/rest_users/5HT ``` Credits ------- * Dmitry Bushmelev * Maxim Sokhatsky OM A HUM