From 0dd046840dea2ba54ff56388a6010a2ae5eadc95 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Wed, 6 May 2015 01:00:07 +0800 Subject: [PATCH] add feed_var/3, join/1 --- apps/emqtt/src/emqtt_topic.erl | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/apps/emqtt/src/emqtt_topic.erl b/apps/emqtt/src/emqtt_topic.erl index c9a057aaa..0fa183614 100644 --- a/apps/emqtt/src/emqtt_topic.erl +++ b/apps/emqtt/src/emqtt_topic.erl @@ -32,7 +32,7 @@ -export([match/2, validate/1, triples/1, words/1, wildcard/1]). --export([is_queue/1, systop/1]). +-export([join/1, feed_var/3, is_queue/1, systop/1]). %-type type() :: static | dynamic. @@ -187,3 +187,27 @@ systop(Name) when is_atom(Name) -> systop(Name) when is_binary(Name) -> list_to_binary(["$SYS/brokers/", atom_to_list(node()), "/", Name]). +-spec feed_var(binary(), binary(), binary()) -> binary(). +feed_var(Var, Val, Topic) -> + feed_var(Var, Val, words(Topic), []). +feed_var(_Var, _Val, [], Acc) -> + join(lists:reverse(Acc)); +feed_var(Var, Val, [Var|Words], Acc) -> + feed_var(Var, Val, Words, [Val|Acc]); +feed_var(Var, Val, [W|Words], Acc) -> + feed_var(Var, Val, Words, [W|Acc]). + +-spec join(list(binary())) -> binary(). +join([]) -> + <<>>; +join([W]) -> + bin(W); +join(Words) -> + {_, Bin} = + lists:foldr(fun(W, {true, Tail}) -> + {false, <>}; + (W, {false, Tail}) -> + {false, <>} + end, {true, <<>>}, [bin(W) || W <- Words]), + Bin. +