3个版本

0.1.2 2022年10月20日
0.1.1 2022年8月23日
0.1.0 2022年8月1日

#1237Rust模式

Download history 7767/week @ 2024-03-14 7840/week @ 2024-03-21 6995/week @ 2024-03-28 7354/week @ 2024-04-04 10070/week @ 2024-04-11 9555/week @ 2024-04-18 5627/week @ 2024-04-25 7513/week @ 2024-05-02 5100/week @ 2024-05-09 6265/week @ 2024-05-16 10019/week @ 2024-05-23 9092/week @ 2024-05-30 7723/week @ 2024-06-06 8699/week @ 2024-06-13 9026/week @ 2024-06-20 7235/week @ 2024-06-27

34,302 每月下载量
用于 8 个crate(通过 strck_ident

MIT 许可证

28KB
379

github-img crates-img docs-img

检查所有者和借用字符串。

概述

Rust标准库提供了Stringstr类型,分别包装了Vec<u8>[u8],内容有效的UTF-8作为不变量。

此crate通过引入不可变的CheckCk类型来抽象字符串的类型级别不变量,其中不变量由泛型Invariant类型参数确定。实现Invariant特质留给其他crate,例如strck_ident

"strck"来自"str check",类似于rustc有typeck和borrowck分别用于类型检查和借用检查。

有关更多详细信息,请参阅文档

动机

处理具有某些属性(如标识符)的类似字符串类型的库会很快变得混乱,因为&strString开始污染类型签名。一种解决方案是手动实现一个所有者检查字符串类型,如syn::Ident来区分类型签名并验证字符串。缺点是如果只需要借用版本,则无法创建新值,这是不必要的。

strck通过提供检查的借用字符串类型Ck和检查的所有者字符串类型Check来解决此问题。这些分别作为strString的薄包装,并在类型级别证明其内容满足包装器泛型化的Invariant

[^1]: Check 实际上可以由任何 'static + AsRef<str> 类型支持,但默认是 String

使用案例

无分配的检查字符串

strck 提供的主要好处是通过 Ck 类型验证借用字符串,而无需在结果中进行分配。

use strck_ident::{Ck, IntoCk, rust::RustIdent};

let this_ident: &Ck<RustIdent> = "this".ck().unwrap();

检查零拷贝反序列化

当启用 serde 功能标志时,可以使用 Ck 进行检查零拷贝反序列化,这需要 #[serde(borrow)] 属性。

use strck_ident::{Ck, unicode::UnicodeIdent};

#[derive(Serialize, Deserialize)]
struct Player<'a> {
    #[serde(borrow)]
    username: &'a Ck<UnicodeIdent>,
    level: u32,
}

请注意,此代码示例明确使用了 Ck<UnicodeIdent> 来演示该类型是 Ck。然而,strck_ident 提供了 Ident 作为 Ck<UnicodeIdent> 的别名,这在实际应用中应该使用。

不可失败的解析

对于字符串验证相对便宜但解析昂贵且容易出错的类型,可以使用 strck 与自定义的 Invariant 作为输入来制作不可失败的解析函数。

使用 IntoCkIntoCheck 后缀构造

此crate公开了两个辅助特质,IntoCkIntoCheck。当在作用域内时,可以使用 .ck().check() 函数分别创建 CkCheck

use strck_ident::{IntoCheck, IntoCk, unicode::UnicodeIdent};

let this_ident = "this".ck::<UnicodeIdent>().unwrap();
let this_foo_ident = format!("{}_foo", this_ident).check::<UnicodeIdent>().unwrap();

文档

有关更多详细信息,请参阅crate级文档

依赖关系

~170KB