api_utils.erl 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. -module(api_utils).
  2. -include("classes.hrl").
  3. -include("logging.hrl").
  4. -include_lib("server/include/log.hrl").
  5. -export([to_known_record/2]).
  6. -export([members/1, members/2, name/1]).
  7. -export([gametype_to_atom/1, gametype_to_binary/1,
  8. gamemodule_to_gametype/1, gametype_to_gamemodule/1]).
  9. gametype_to_atom(<<"okey">>) -> okey;
  10. gametype_to_atom(<<"king">>) -> king;
  11. gametype_to_atom(<<"tavla">>) -> tavla;
  12. gametype_to_atom(A) when is_atom(A) -> A.
  13. gamemodule_to_gametype(Atom) -> "game_" ++ X = atom_to_list(Atom), list_to_atom(X).
  14. gametype_to_gamemodule(Atom) -> list_to_atom("game_" ++ atom_to_list(Atom)).
  15. gametype_to_binary(GT) -> atom_to_binary(GT, latin1).
  16. members(T) -> members(T, recrunt).
  17. members(T, recrunt) -> Keys = recrunt:fields(T), Values = tl(tuple_to_list(T)), lists:zip(Keys, Values);
  18. members(T, Module) ->
  19. try
  20. Keys = Module:fields(T),
  21. Values = tl(tuple_to_list(T)),
  22. lists:zip(Keys, Values)
  23. catch _:_ ->
  24. members(T, recrunt)
  25. end.
  26. name(T) -> element(1, T).
  27. to_known_record(Bin, Members) when is_binary(Bin) ->
  28. Tag = try
  29. T = list_to_atom(binary_to_list(Bin)),
  30. recrunt:fields(T),
  31. T
  32. catch
  33. _:_ ->
  34. ?INFO("{Bin, Members}: ~p", [{Bin, Members}]),
  35. erlang:error(api_error_unknown_call)
  36. end,
  37. to_known_record(Tag, Members);
  38. to_known_record(Tag, Members0) when is_atom(Tag) ->
  39. try
  40. Names = recrunt:fields(Tag),
  41. % ?INFO("Names: ~p, Members: ~p",[Names,case Members0 of null -> []; X -> X end]),
  42. Members = case to_proper_proplists(Members0) of null -> []; Y -> Y end,
  43. % ?INFO("Members: ~p",[Members]),
  44. Rev = lists:map(fun(X) ->
  45. Res = proplists:get_value(X, Members),
  46. %% true = (Res =/= undefined),
  47. Res
  48. end, Names),
  49. List = [Tag | Rev],
  50. list_to_tuple(List)
  51. catch
  52. _:_ ->
  53. ?INFO("{Tag, Members0}: ~p", [{Tag, Members0}]),
  54. erlang:error(api_error_wrong_params)
  55. end.
  56. to_proper_proplists([{A, _} | _] = List) when is_binary(A)-> to_proper_proplists(List, []);
  57. to_proper_proplists(List) -> List.
  58. to_proper_proplists([], Acc) -> lists:reverse(Acc);
  59. to_proper_proplists([{A, B} | R], Acc) when is_binary(A)-> to_proper_proplists(R, [{list_to_atom(binary_to_list(A)), B} | Acc]).