Ковбойские и случайные события websocket_handle
Я использую ковбой и jiffy (библиотека Json) для своей websocket.. Я могу получить данные от клиента в моем websocket_handle, так как сейчас у меня есть код, подобный этому
websocket_handle({text, Msg}, Req, Handle) ->
Message = jiffy:decode(Msg),
case Message of
pattern1 -> ........... pattern2 -> .......... end, {ok, Res, State}
Однако вместо этого я хотел бы сопоставить шаблон на уровне дескриптора...
websocket_handle({text, pattern1}, Req, State),
websocket_handle({text, pattern2}, Req, State)
Проблема в том, что я не могу использовать jiffy:decode в параметре websocket_handle.. поэтому я не могу написать что-то вроде
websocket_handle({text, jiffy:decode(Msg), Req, State})
Как заставить это работать???
2 ответа
Решение
Если вам нравится сопоставление с образцом в сигнатуре функции против выражения case, вы можете "переслать" декодированное сообщение другой "внутренней" функции.
websocket_handle({text, Msg}, Req, Handle) ->
Message = jiffy:decode(Msg),
websocket_handle_({test, Message}, Req, Handle).
websocket_handle_({text, Pattern1}, Req, Handle) ->
{ok, Req, State};
websocket_handle_({text, Pattern2}, Req, Handle) ->
{reply, OutFrame | [OutFrame], Req, State};
websocket_handle_({text, PatternN}, Req, Handle) ->
{ok, Req, State}.
Так что просто измените на
websocket_handle({text, Msg}, Req, Handle) ->
websocket_handle_({text, jiffy:decode(Msg)}, Req, Handle).
websocket_handle_({text, Pattern1}, Req, Handle) ->
%% do stuff,
{ok, Req, State};
websocket_handle_({text, Pattern2}, Req, Handle) ->
%% do stuff,
{reply, [OutFrame], Req, State};
websocket_handle_({text, PatternN}, Req, Handle) ->
%% do stuff,
{reply, OutFrame, Req, State}.