#string #quoted #mime #email

quoted-string

处理引用字符串的规范无关实用工具(在邮件、MIME类型等中)

5 个版本

使用旧的Rust 2015

0.6.1 2019年10月11日
0.6.0 2018年6月11日
0.3.0 2017年11月27日
0.2.2 2017年11月13日

#480 in 编码

Download history 914/week @ 2024-04-23 1129/week @ 2024-04-30 966/week @ 2024-05-07 1145/week @ 2024-05-14 1247/week @ 2024-05-21 770/week @ 2024-05-28 825/week @ 2024-06-04 645/week @ 2024-06-11 1031/week @ 2024-06-18 814/week @ 2024-06-25 638/week @ 2024-07-02 596/week @ 2024-07-09 662/week @ 2024-07-16 835/week @ 2024-07-23 1148/week @ 2024-07-30 679/week @ 2024-08-06

每月下载量 3,435
用于 31 个crate(11 个直接使用)

MIT/Apache

50KB
925

quoted-string Crates.io quoted-string License License 构建状态

此crate提供处理如媒体类型(包括MIME(即邮件)和HTTP)中出现的引用字符串的实用工具。由于不同规范之间存在许多微小但重要的差异,因此此crate不提供特定的实现。相反,公开了一个QuotedStringSpec trait。通过实现它(在零尺寸类型上),应允许与任何引用字符串规范一起使用。

可用的功能包括

  • quote_if_needed (&quote):如果有必要,对内容进行引用,QuotedStringSpecUnquotedValidator部分可以用来指定哪些值是有效的,而无需将其表示为引用字符串。例如,在媒体类型中,参数值abc可以直接在quoted_if_needed上表示。其好处是它返回一个Cow,因此只有在实际需要表示为引用字符串时才进行字符串复制。

  • to_content:检索引用字符串的内容,这意味着将移除周围的'"'引号,并将任何引用对(例如"\\\""/r#"\""#)替换为其值。如果没有引用对阻止不必要的分配,则此函数返回Cow::Borrowed

  • ContentChars:一个遍历引用字符串内容的字符迭代器,即它会去除周围的DQUOTE,并且(动态地)取消引用不需要额外内存分配的引用对。这可以用来语义上比较两个引用字符串,而不管它们如何使用quoted-pair,它实现了Eq

  • parse (&validate):解析输入开始处的引用字符串。它被编写得易于与nom集成(尽管它不依赖于nom,单独使用它同样简单)

示例

extern crate quoted_string;

// we use a QuotedStringSpec provided for testing here,
// not that it's made to hit some edge cases in a simple way
// so it does not correspond to any used real Spec
use quoted_string::test_utils::{TestSpec as Spec};
use quoted_string::spec::AsciiWordValidator;
use quoted_string::{parse, quote, quote_if_needed, to_content};

fn main() {
    let res = parse::<Spec>("\"quoted\\\"st\\ring\"; tail=x").unwrap();
    let qs = res.quoted_string;
    assert_eq!(qs, "\"quoted\\\"st\\ring\"");
    assert_eq!(res.tail, "; tail=x");
    let content = to_content::<Spec>(qs)
        .expect("[BUG] to_content is guaranteed to succeed if input is a valid quoted string");
    assert_eq!(content, "quoted\"string");
    let re_quoted = quote::<Spec>(&*content)
        .expect("[BUG] quote is guaranteed to succeed if the input is representable in a quoted string");
    assert_eq!(re_quoted, "\"quoted\\\"string\"");

    // TestSpec specifies us-ascii words with 6 letters need no quoting
    let mut without_quoting = AsciiWordValidator;
    let out = quote_if_needed::<Spec, _>("simple", &mut without_quoting).unwrap();
    assert_eq!(&*out, "simple");
}


许可证

在以下任一许可证下授权:

由您选择。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,都应按上述方式双重许可,不附加任何额外条款或条件。

变更日志

  • 0.3.0:通过引入 QuotedStringSpec 使软件包独立于任何特定的引用字符串规范,因为媒体类型中引用字符串在 HTTP 中的差异很多,因此在 MIME(邮件)中也存在差异

  • 0.3.1:注意到 ValidationResult 没有公开,但也没有在公共接口中收到私有类型的警告... 已修复

  • 0.4.0:

    • ValidationResult 中移除了 Escape
    • NotSemanticWs 重命名为 NotSemantic
    • Quotable 重命名为 NeedsQuotedPair
    • UnquotedValidator 中移除了不必要的 Err 关联类型
    • UnquotedValidatorQuotedValidatorend_validation 添加了默认实现
  • 0.5.0:

    • 将规范更改为由内部自动机使用
    • strip_quotes 重命名为 strip_dquotes
    • 为 WithoutQuotingValidator::end 添加默认实现
  • 0.6.0:

    • 最低 rust 版本现在是 rustc v1.24
    • 添加了 AsciiWordValidator
    • 修复了 README 中的示例

无运行时依赖