Skip to content

Commit 3859e9e

Browse files
authored
Merge pull request #24 from rkallos/feature/use-decorator-for-custom-event-fun
Use a decorator fun instead of replacing EventFun
2 parents fec4e98 + 25b4b90 commit 3859e9e

File tree

3 files changed

+74
-6
lines changed

3 files changed

+74
-6
lines changed

src/wrek_vert.erl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,12 @@ handle_call({exec, Dir, Cmd, Env}, _From, State = #state{event_mgr = EvMgr}) ->
118118
end,
119119
handle_exec(Dir, Cmd, Env, EventFun, State);
120120

121-
handle_call({exec, Dir, Cmd, Env, EventFun}, _From, State) ->
121+
handle_call({exec, Dir, Cmd, Env, EventFun0}, _From, State = #state{event_mgr = EvMgr}) ->
122+
EventFun =
123+
fun(Msg) ->
124+
wrek_event:exec_output(EvMgr, id(State), Msg),
125+
EventFun0(Msg)
126+
end,
122127
handle_exec(Dir, Cmd, Env, EventFun, State);
123128

124129
handle_call({get, Who0, Key, Default}, _From, State) ->

test/wrek_cb_event_handler.erl

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
-module(wrek_cb_event_handler).
2+
-include("wrek_event.hrl").
3+
4+
-export([code_change/3,
5+
handle_call/2,
6+
handle_event/2,
7+
handle_info/2,
8+
init/1,
9+
terminate/2]).
10+
-behaviour(gen_event).
11+
12+
13+
-record(state, {
14+
caller = undefined :: pid(),
15+
count = 0 :: integer(),
16+
evts = [] :: [wrek_event()],
17+
fail_mode = total :: total | partial
18+
}).
19+
20+
21+
%% callbacks
22+
23+
code_change(_OldVsn, State, _Extra) ->
24+
{ok, State}.
25+
26+
handle_call(get, State) ->
27+
{ok, State#state.count, State};
28+
29+
handle_call(_, State) ->
30+
{ok, ok, State}.
31+
32+
33+
handle_event(#wrek_event{type = exec, msg = {_, Data}}, Pid) ->
34+
Pid ! {event_handler, Data},
35+
{ok, Pid};
36+
37+
handle_event(Evt, State) ->
38+
{ok, State}.
39+
40+
41+
handle_info(_, State) ->
42+
{ok, State}.
43+
44+
45+
init([CallbackPid]) ->
46+
{ok, CallbackPid}.
47+
48+
49+
terminate(_, _State) ->
50+
ok.

test/wrek_tests.erl

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -337,20 +337,33 @@ sandbox_test() ->
337337
custom_exec_callback_test() ->
338338
Self = self(),
339339
Callback = fun({_, Data}) ->
340-
Self ! Data
340+
Self ! {event_fun, Data}
341341
end,
342342

343+
{ok, EvMgr} = gen_event:start_link(),
344+
gen_event:add_handler(EvMgr, wrek_cb_event_handler, [Self]),
345+
343346
Dag = #{cb => #{module => wrek_echo_vert, args => [Callback, "good"], deps => []}},
344347

345-
wrek:start(Dag),
348+
wrek:start(Dag, [{event_manager, EvMgr}]),
346349

347-
Msg = receive
348-
M -> M
350+
EventFunMsg = receive
351+
{event_fun, Efm} -> Efm
352+
after
353+
500 -> bad
354+
end,
355+
356+
EventHandlerMsg = receive
357+
{event_handler, Ehm} -> Ehm
349358
after
350359
500 -> bad
351360
end,
352361

353-
?assertEqual(Msg, <<"good">>).
362+
gen_event:stop(EvMgr),
363+
364+
?assertEqual(EventFunMsg, <<"good">>),
365+
?assertEqual(EventHandlerMsg, <<"good">>),
366+
?assertEqual(EventFunMsg, EventHandlerMsg).
354367

355368
wrek_timeout_test() ->
356369
exec:start(),

0 commit comments

Comments
 (0)