Просмотр исходного кода

Move the 'pipeline' function to 'emqx_misc' module

Feng Lee 6 лет назад
Родитель
Сommit
08ab350fec
2 измененных файлов с 31 добавлено и 29 удалено
  1. 12 29
      src/emqx_channel.erl
  2. 19 0
      src/emqx_misc.erl

+ 12 - 29
src/emqx_channel.erl

@@ -50,9 +50,11 @@
 
 -export([gc/3]).
 
--import(emqx_misc, [maybe_apply/2]).
-
--import(emqx_access_control, [check_acl/3]).
+-import(emqx_misc,
+        [ run_fold/3
+        , pipeline/3
+        , maybe_apply/2
+        ]).
 
 -export_type([channel/0]).
 
@@ -480,10 +482,10 @@ do_unsubscribe(TopicFilter, _SubOpts,
 %%--------------------------------------------------------------------
 
 handle_out({connack, ?RC_SUCCESS, SP}, Channel = #channel{client = Client}) ->
-    AckProps = emqx_misc:run_fold([fun enrich_caps/2,
-                                   fun enrich_server_keepalive/2,
-                                   fun enrich_assigned_clientid/2
-                                  ], #{}, Channel),
+    AckProps = run_fold([fun enrich_caps/2,
+                         fun enrich_server_keepalive/2,
+                         fun enrich_assigned_clientid/2
+                        ], #{}, Channel),
     AckPacket = ?CONNACK_PACKET(?RC_SUCCESS, SP, AckProps),
     Channel1 = ensure_keepalive(AckProps, ensure_connected(Channel)),
     ok = emqx_hooks:run('client.connected',
@@ -1016,7 +1018,8 @@ check_publish(Packet, Channel) ->
 %% Check Pub ACL
 check_pub_acl(#mqtt_packet{variable = #mqtt_packet_publish{topic_name = Topic}},
               #channel{client = Client}) ->
-    case is_acl_enabled(Client) andalso check_acl(Client, publish, Topic) of
+    case is_acl_enabled(Client) andalso
+         emqx_access_control:check_acl(Client, publish, Topic) of
         false -> ok;
         allow -> ok;
         deny  -> {error, ?RC_NOT_AUTHORIZED}
@@ -1057,7 +1060,7 @@ check_subscribe(TopicFilter, SubOpts, Channel) ->
 %% Check Sub ACL
 check_sub_acl(TopicFilter, #channel{client = Client}) ->
     case is_acl_enabled(Client) andalso
-         check_acl(Client, subscribe, TopicFilter) of
+         emqx_access_control:check_acl(Client, subscribe, TopicFilter) of
         false  -> allow;
         Result -> Result
     end.
@@ -1176,26 +1179,6 @@ unmount(Client = #{mountpoint := MountPoint}, TopicOrMsg) ->
     emqx_mountpoint:unmount(
       emqx_mountpoint:replvar(MountPoint, Client), TopicOrMsg).
 
-%%--------------------------------------------------------------------
-%% Pipeline
-%%--------------------------------------------------------------------
-
-pipeline([], Packet, Channel) ->
-    {ok, Packet, Channel};
-
-pipeline([Fun|More], Packet, Channel) ->
-    case Fun(Packet, Channel) of
-        ok -> pipeline(More, Packet, Channel);
-        {ok, NChannel} ->
-            pipeline(More, Packet, NChannel);
-        {ok, NPacket, NChannel} ->
-            pipeline(More, NPacket, NChannel);
-        {error, ReasonCode} ->
-            {error, ReasonCode, Channel};
-        {error, ReasonCode, NChannel} ->
-            {error, ReasonCode, NChannel}
-    end.
-
 %%--------------------------------------------------------------------
 %% Helper functions
 %%--------------------------------------------------------------------

+ 19 - 0
src/emqx_misc.erl

@@ -21,6 +21,7 @@
 -export([ merge_opts/2
         , maybe_apply/2
         , run_fold/3
+        , pipeline/3
         , start_timer/2
         , start_timer/3
         , cancel_timer/1
@@ -57,11 +58,29 @@ maybe_apply(_Fun, undefined) ->
 maybe_apply(Fun, Arg) when is_function(Fun) ->
     erlang:apply(Fun, [Arg]).
 
+%% @doc RunFold
 run_fold([], Acc, _State) ->
     Acc;
 run_fold([Fun|More], Acc, State) ->
     run_fold(More, Fun(Acc, State), State).
 
+%% @doc Pipeline
+pipeline([], Input, State) ->
+    {ok, Input, State};
+
+pipeline([Fun|More], Input, State) ->
+    case Fun(Input, State) of
+        ok -> pipeline(More, Input, State);
+        {ok, NState} ->
+            pipeline(More, Input, NState);
+        {ok, NInput, NState} ->
+            pipeline(More, NInput, NState);
+        {error, Reason} ->
+            {error, Reason, State};
+        {error, Reason, NState} ->
+            {error, Reason, NState}
+    end.
+
 -spec(start_timer(integer(), term()) -> reference()).
 start_timer(Interval, Msg) ->
     start_timer(Interval, self(), Msg).