1个不稳定版本
0.1.0 | 2020年3月27日 |
---|
#1066 在 音频
每月 502 次下载
用于 10 crate
21KB
187 行
支持URID的库。
在RDF的世界里,资源是通过URI进行描述的。在Rust中,这个概念可以通过UriBound
trait来描述具有URI的类型。然后,其他crate可以使用这些URI来描述类型或值之间的关系。
然而,比较URI不一定快。因此,引入了另一个概念:URID。URID基本上是一个表示URI的u32
。这些URID由一个Map
分配,并且可以通过一个Unmap
进行“取消引用”。
这个库还支持通过泛型参数将URID连接到它们的UriBound
。例如,这可以用来将某个特定约束的URID作为函数的参数请求。如果有人尝试用错误的URID调用这个函数,编译器将在代码编译之前抛出错误。
现在这可能看起来微不足道,但音频插件框架rust-lv2严重依赖这个crate进行快速、可移植和动态的数据识别和交换。
示例
use urid::*;
// Some types with URIs. The attribute implements `UriBound` with the given URI.
#[uri("urn:urid-example:my-struct-a")]
struct MyStructA;
#[uri("urn:urid-example:my-struct-b")]
struct MyStructB;
// A collection of URIDs that can be created by a mapper with one method call.
#[derive(URIDCollection)]
struct MyURIDCollection {
my_struct_a: URID<MyStructA>,
my_struct_b: URID<MyStructB>,
}
// A function that checks whether the unmapper behaves correctly.
// Due to the type argument, it can not be misused.
fn test_unmapper<M: Unmap, T: UriBound>(unmap: &M, urid: URID<T>) {
assert_eq!(T::uri(), unmap.unmap(urid).unwrap());
}
// Create a simple mapper. The `HashURIDMapper` is thread-safe and can map and unmap all URIs.
let map = HashURIDMapper::new();
// Get the URIDs of the structs. You can use the collection or retrieve individual URIDs.
let urids: MyURIDCollection = map.populate_collection().unwrap();
let urid_a: URID<MyStructA> = map.map_type().unwrap();
// You can also retrieve the URID of a single URI without a binding to a type.
let urid_b: URID = map.map_str("https://rustup.rs").unwrap();
test_unmapper(&map, urids.my_struct_a);
test_unmapper(&map, urids.my_struct_b);
test_unmapper(&map, urid_a);
许可
根据以下之一许可
- Apache许可证,版本2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
依赖关系
~1.5MB
~34K SLoC