2个稳定版本
1.0.1 | 2023年12月26日 |
---|
#708 在 解析器实现 中
380KB
1.5K SLoC
rpsl-rs
符合RFC 2622的,专注于速度和正确性的路由策略规范语言(RPSL)解析器。
⚡️ 比其他解析器快130-250倍
📰 完整实现多行RPSL值
💬 能够直接从whois服务器响应中解析对象
🧠 通过利用零拷贝降低内存占用
🧪 通过属性测试确保任何有效输入的健壮解析
使用方法
解析RPSL对象
包含RPSL表示法的对象的字符串可以使用 parse_object 函数解析为 ObjectView。
use rpsl::parse_object;
let role_acme = "
role: ACME Company
address: Packet Street 6
address: 128 Series of Tubes
address: Internet
email: [email protected]
nic-hdl: RPSL1-RIPE
source: RIPE
";
let parsed = parse_object(role_acme)?;
返回的 ObjectView 允许以 AttributeView 的形式访问包含在内的属性,这是一个包含其表示的数据引用的类型,这使得解析器非常内存高效且性能出色,因为解析过程中不需要进行分配。
role: ACME Company ◀─────────────── &"role" ─── &"ACME Company"
address: Packet Street 6 ◀──────────── &"address" ─── &"Packet Street 6"
address: 128 Series of Tubes ◀──────── &"address" ─── &"128 Series of Tubes"
address: Internet ◀─────────────────── &"address" ─── &"Internet"
email: [email protected] ◀───────── &"email" ─── &"[email protected]"
nic-hdl: RPSL1-RIPE ◀───────────────── &"nic-hdl" ─── &"RPSL1-RIPE"
source: RIPE ◀─────────────────────── &"source" ─── &"RIPE"
println!("{:#?}", parsed);
ObjectView(
[
AttributeView {
name: NameView("role",),
value: SingleLine(Some("ACME Company")),
},
AttributeView {
name: NameView("address"),
value: SingleLine(Some("Packet Street 6")),
},
AttributeView {
name: NameView("address"),
value: SingleLine(Some("128 Series of Tubes")),
},
AttributeView {
name: NameView("address"),
value: SingleLine(Some("Internet")),
},
AttributeView {
name: NameView("email"),
value: SingleLine(Some("[email protected]")),
},
AttributeView {
name: NameView("nic-hdl"),
value: SingleLine(Some("RPSL1-RIPE")),
},
AttributeView {
name: NameView("source"),
value: SingleLine(Some("RIPE")),
},
]
)
每个 AttributeView 都可以通过其索引访问,并具有名称和可选值。
println!("{:#?}", parsed[1]);
AttributeView {
name: NameView("address"),
value: SingleLine(Some("Packet Street 6")),
}
由于RPSL属性值可以是单行或多行,因此使用两种不同的类型来表示它们。有关更多信息和示例,请参阅 Attribute 和 parse_object。
ObjectView 可以转换为以及直接与它们的所有者对应物 Object 进行比较。
let owned = object! {
"role": "ACME Company";
"address": "Packet Street 6";
"address": "128 Series of Tubes";
"address": "Internet";
"email": "[email protected]";
"nic-hdl": "RPSL1-RIPE";
"source": "RIPE";
};
assert_eq!(role_acme, owned);
assert_eq!(role_acme.to_owned(), owned);
解析WHOIS服务器响应
WHOIS服务器通常通过返回多个相关对象来响应查询。例如,对AS32934
的ARIN查询将首先返回请求的ASNumber
对象,然后是相关的OrgName
$ whois -h whois.arin.net AS32934
ASNumber: 32934
ASName: FACEBOOK
ASHandle: AS32934
RegDate: 2004-08-24
Updated: 2012-02-24
Comment: Please send abuse reports to [email protected]
Ref: https://rdap.arin.net/registry/autnum/32934
OrgName: Facebook, Inc.
OrgId: THEFA-3
Address: 1601 Willow Rd.
City: Menlo Park
StateProv: CA
PostalCode: 94025
Country: US
RegDate: 2004-08-11
Updated: 2012-04-17
Ref: https://rdap.arin.net/registry/entity/THEFA-3
要提取每个单独的对象,可以使用parse_whois_response函数将响应解析为包含响应中所有单个ObjectView的Vec
。示例可以在函数文档中找到。
贡献
任何大小的贡献,只要能以任何方式改进rpsl-rs
,无论是DX/UX、文档、性能还是其他方面,都将非常受赞赏。要开始,请阅读贡献指南。在开始工作于你想要贡献的、可能会影响简洁性、可靠性或性能的新功能之前,请先提出一个issue。
许可证
此项目的源代码受MIT许可证的许可。有关更多信息,请参阅LICENSE。
依赖
~1–1.8MB
~36K SLoC