16个版本
0.3.0 | 2024年5月26日 |
---|---|
0.2.7 | 2024年3月8日 |
0.2.5 | 2023年6月17日 |
0.2.3 | 2022年10月6日 |
0.1.2 | 2021年12月26日 |
#197 in 网络编程
每月180次下载
用于8个Crates (4直接)
52KB
1.5K SLoC
submap
B-Tree pub/sub服务映射。
订阅映射
使用方法
use submap::SubMap;
type Client = String;
let mut smap: SubMap<Client> = SubMap::new();
其中 "Client" 是pub/sub客户端类型,通常是通道或包含通道、锁定套接字或其他与客户端一起工作所需内容的结构。
客户端类型必须提供特质 Ord、Eq 和 Clone。
在它们可以订阅/取消订阅之前,所有客户端都必须在映射中注册。使用 "register_client" 函数进行此操作。
调用 "unregister_client" 时,它也会自动将客户端从所有已订阅的主题中取消订阅。
分隔符和通配符
SubMap支持以下掩码
- this/is/a/topic - 单个主题订阅
- this/?/a/topic - 匹配模式的所有主题(第2块 - 任何值)
- this/is/* - "this/is" 的所有子主题
- * - 所有主题
服务符号可以更改。例如,让我们创建一个具有MQTT样式通配符(+代表?,#代表*)但以点作为子主题分隔符的订阅映射
use submap::SubMap;
type Client = String;
let mut smap: SubMap<Client> =
SubMap::new().separator('.').match_any("+").wildcard("#");
注意,"/topic/x"、"topic/x" 和 "topic//x" 是三个不同的主题。如果需要任何类型的规范化,应在调用SubMap函数之前手动完成。
公式
SubMap还支持公式,这些公式用于通过公式订阅主题或获取匹配一个的客户端列表。
公式是非标准pub/sub功能,当客户端想订阅具有例如某些重要性级别的主题时很有用。客户端可以订阅一个具有公式的主题,而不是订阅所有级别主题,而不是订阅所有级别主题。
use submap::SubMap;
type Client = String;
let mut smap: SubMap<Client> =
SubMap::new().separator('/').match_any("+").wildcard("#").formula_prefix('!');
let client1 = "client1".to_owned();
smap.register_client(&client1);
smap.subscribe("some/!ge(2)/topic", &client1);
assert_eq!(smap.get_subscribers("some/1/topic").len(), 0);
assert_eq!(smap.get_subscribers("some/2/topic").len(), 1);
assert_eq!(smap.get_subscribers("some/3/topic").len(), 1);
更多: mkmf::Formula
.
广播映射
use submap::BroadcastMap;
type Client = String;
let mut bmap: BroadcastMap<Client> = BroadcastMap::new();
执行相反的操作 - 客户端使用常规名称注册,而 "get_clients_by_mask" 函数返回与掩码匹配的客户端。
注意:默认分隔符是点。
ACL映射
let mut acl_map = submap::AclMap::new();
基于SubMap的高速访问控制列表检查器。使用单个单元 "client" 的SubMap算法验证各种访问控制列表。
Crates功能
- indexmap 将引擎切换到 indexmap(默认基于 std::collections::BTreeMap/BTreeSet),需要为映射客户端实现 Hash 特性。
当前引擎可以从以下途径获得
use submap::types::ENGINE;
dbg!(ENGINE); // std-btree or indexmap
Cargo 包
依赖关系
~0.3–1.8MB
~41K SLoC