summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Müller <neikos@neikos.email>2023-01-05 10:43:42 +0100
committerMarcel Müller <neikos@neikos.email>2023-01-05 10:52:19 +0100
commite4c2a2110c4ce227ed116fda08077f57441565e7 (patch)
treed5458829e30dfe7857dd1de4f43902f3cd429a61
parentb958d9405bbd89ad70334ea9fdc4a7ba997b76ce (diff)
Implement topic filtering behaviour
Signed-off-by: Marcel Müller <neikos@neikos.email>
-rw-r--r--src/server/mod.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs
index 0354363..17f1f97 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -250,7 +250,27 @@ impl<LH: LoginHandler, SH: SubscriptionHandler> MqttServer<LH, SH> {
match message {
Ok(message) => {
- if topics.iter().any(|_topic| todo!()) {
+ if topics.iter().any(|topic| {
+ let msg_topic = TopicFilter::parse_from(message.topic().to_string());
+
+ let mut i = 0;
+ loop {
+ match (topic.get(i), msg_topic.get(i)) {
+ (None, None) => break true,
+ (None, Some(_)) => break false,
+ (Some(_), None) => break false,
+ (Some(TopicFilter::MultiWildcard), Some(_)) => break true,
+ (Some(TopicFilter::SingleWildcard), Some(_)) => (),
+ (Some(left), Some(right)) => {
+ if left != right {
+ break false;
+ }
+ }
+ }
+
+ i += 1;
+ }
+ }) {
callback(message).await;
}
}