Question

I am using cowboy and jiffy (Json library) for my websocket.. I can receive the data from client in my websocket_handle as of now i have code similar to this

websocket_handle({text, Msg}, Req, Handle) ->
    Message = jiffy:decode(Msg),
    case Message of  

       pattern1 -> ........... pattern2 -> .......... end, {ok, Res, State}

However instead of this i would like to pattern match at the handle level...

  websocket_handle({text, pattern1}, Req, State),
  websocket_handle({text, pattern2}, Req, State)

Problem is that i cant use jiffy:decode in parameter of websocket_handle.. so i cant write something like

 websocket_handle({text, jiffy:decode(Msg), Req, State})

How to make it work??? 

Was it helpful?

Solution

If you like pattern matching in the function signature vs a case expression, you could 'forward' the decoded message to another 'internal' function.

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}.

OTHER TIPS

So just change to

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}.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top