1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- -module(api_utils).
- -include("classes.hrl").
- -include("logging.hrl").
- -include_lib("server/include/log.hrl").
- -export([to_known_record/2]).
- -export([members/1, members/2, name/1]).
- -export([gametype_to_atom/1, gametype_to_binary/1,
- gamemodule_to_gametype/1, gametype_to_gamemodule/1]).
- gametype_to_atom(<<"okey">>) -> okey;
- gametype_to_atom(<<"king">>) -> king;
- gametype_to_atom(<<"tavla">>) -> tavla;
- gametype_to_atom(A) when is_atom(A) -> A.
- gamemodule_to_gametype(Atom) -> "game_" ++ X = atom_to_list(Atom), list_to_atom(X).
- gametype_to_gamemodule(Atom) -> list_to_atom("game_" ++ atom_to_list(Atom)).
- gametype_to_binary(GT) -> atom_to_binary(GT, latin1).
- members(T) -> members(T, recrunt).
- members(T, recrunt) -> Keys = recrunt:fields(T), Values = tl(tuple_to_list(T)), lists:zip(Keys, Values);
- members(T, Module) ->
- try
- Keys = Module:fields(T),
- Values = tl(tuple_to_list(T)),
- lists:zip(Keys, Values)
- catch _:_ ->
- members(T, recrunt)
- end.
- name(T) -> element(1, T).
- to_known_record(Bin, Members) when is_binary(Bin) ->
- Tag = try
- T = list_to_atom(binary_to_list(Bin)),
- recrunt:fields(T),
- T
- catch
- _:_ ->
- ?INFO("{Bin, Members}: ~p", [{Bin, Members}]),
- erlang:error(api_error_unknown_call)
- end,
- to_known_record(Tag, Members);
- to_known_record(Tag, Members0) when is_atom(Tag) ->
- try
- Names = recrunt:fields(Tag),
- % ?INFO("Names: ~p, Members: ~p",[Names,case Members0 of null -> []; X -> X end]),
- Members = case to_proper_proplists(Members0) of null -> []; Y -> Y end,
- % ?INFO("Members: ~p",[Members]),
- Rev = lists:map(fun(X) ->
- Res = proplists:get_value(X, Members),
- %% true = (Res =/= undefined),
- Res
- end, Names),
- List = [Tag | Rev],
- list_to_tuple(List)
- catch
- _:_ ->
- ?INFO("{Tag, Members0}: ~p", [{Tag, Members0}]),
- erlang:error(api_error_wrong_params)
- end.
- to_proper_proplists([{A, _} | _] = List) when is_binary(A)-> to_proper_proplists(List, []);
- to_proper_proplists(List) -> List.
- to_proper_proplists([], Acc) -> lists:reverse(Acc);
- to_proper_proplists([{A, B} | R], Acc) when is_binary(A)-> to_proper_proplists(R, [{list_to_atom(binary_to_list(A)), B} | Acc]).
|