-- ########################################################################### -- -- Generic functions to subscribe and unsubscribe multiple topics at once. -- -- subscribe_multi accepts a table of topic/qos entries. The topics are -- subscribed one after another. -- -- unsubscribe_multi accepts the same table to unsubscribe from topics. -- The qos value is ignored. -- -- Usage: -- mytopics = {["topic1"] = 0, ["topic2"] = 1} -- subscribe_multi(m, mytopics, function(client) -- print("multiple topics subscription done") -- end) -- -- unsubscribe_multi(m, mytopics, function(client) -- print("multiple topics unsubscription done") -- end) -- -- ########################################################################### function subscribe_multi(client, uv_topics, uv_cb) local uv_topic, uv_qos = next(uv_topics, nil) -- more upvals local function subscribe_cb(client) print("subscribed to topic", uv_topic) uv_topic, uv_qos = next(uv_topics, uv_topic) if uv_topic ~= nil and uv_qos ~= nil then client:subscribe(uv_topic, uv_qos, subscribe_cb) else uv_cb(client) end end client:subscribe(uv_topic, uv_qos, subscribe_cb) end function unsubscribe_multi(client, uv_topics, uv_cb) local uv_topic = next(uv_topics, nil) -- more upval local function unsubscribe_cb(client) print("unsubscribed from topic", uv_topic) uv_topic = next(uv_topics, uv_topic) if uv_topic ~= nil then client:unsubscribe(uv_topic, unsubscribe_cb) else uv_cb(client) end end client:unsubscribe(uv_topic, unsubscribe_cb) end