From 1cf45329477f97ec2fcd7027b3a72721fde092ab Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Tue, 28 Aug 2018 20:40:31 +0800 Subject: [PATCH] Add emqx_mountpoint module --- src/emqx_mountpoint.erl | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/emqx_mountpoint.erl diff --git a/src/emqx_mountpoint.erl b/src/emqx_mountpoint.erl new file mode 100644 index 000000000..f2046d5ee --- /dev/null +++ b/src/emqx_mountpoint.erl @@ -0,0 +1,52 @@ +%% Copyright (c) 2018 EMQ Technologies Co., Ltd. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. + +-module(emqx_mountpoint). + +-include("emqx.hrl"). + +-export([mount/2, unmount/2]). +-export([replvar/2]). + +-type(mountpoint() :: binary()). +-export_type([mountpoint/0]). + +mount(undefined, Any) -> + Any; +mount(MountPoint, Msg = #message{topic = Topic}) -> + Msg#message{topic = <>}; + +mount(MountPoint, TopicFilters) when is_list(TopicFilters) -> + [{<>, SubOpts} || {Topic, SubOpts} <- TopicFilters]. + +unmount(undefined, Msg) -> + Msg; +unmount(MountPoint, Msg = #message{topic = Topic}) -> + case catch split_binary(Topic, byte_size(MountPoint)) of + {MountPoint, Topic1} -> Msg#message{topic = Topic1}; + _Other -> Msg + end. + +replvar(undefined, _Vars) -> + undefined; +replvar(MountPoint, #{client_id := ClientId, username := Username}) -> + lists:foldl(fun feed_var/2, MountPoint, [{<<"%c">>, ClientId}, {<<"%u">>, Username}]). + +feed_var({<<"%c">>, ClientId}, MountPoint) -> + emqx_topic:feed_var(<<"%c">>, ClientId, MountPoint); +feed_var({<<"%u">>, undefined}, MountPoint) -> + MountPoint; +feed_var({<<"%u">>, Username}, MountPoint) -> + emqx_topic:feed_var(<<"%u">>, Username, MountPoint). +