1 个稳定版本
1.0.0 | 2023年11月17日 |
---|
#5 in #url-scheme
11KB
160 行
url_parser_on_rust
概述
本项目使用 pest
解析器生成器在 Rust 中实现了 URL 解析器。该解析器旨在处理 URL 的各种组件,包括方案、主机、端口、路径、查询参数和片段。
安装
要在您的 Rust 项目中使用解析器,请在 Cargo.toml 文件中将其添加为依赖项
[dependencies]
url_parser_on_rust = "1.0.0"
在 crates.io 上选择当前版本:url_parser_on_rust
使用方法
作为库
首先,在您的 Rust 代码中导入库
use url_parser_on_rust::parse_url;
然后,您可以使用 parse_markdown 函数将 Markdown 文本转换为 HTML
fn main() {
let url_string = "https://www.example.com/path?query=some";
match parse_url(url_string) {
Ok(parsed_url) => println!("Successfully parsed URL: {:?}", parsed_url),
Err(err) => eprintln!("Error parsing URL: {}", err),
}
}
作为 CLI
您还可以将此解析器用作命令行工具。为此,首先在您的系统上安装 Rust 工具链。然后,克隆仓库并构建项目
$ make help
$ make run path/to/file/file.txt
or
$ make run http://urlfrom.com
功能
-
灵活的 URL 解析: 解析器支持广泛的 URL 格式,允许在提供的 URL 结构中具有灵活性。
-
可选组件: 路径、查询参数和片段等组件是可选的,提供在处理具有或不具有这些元素的 URL 时的多功能性。
-
错误处理: 使用
Result
类型实现适当的错误处理,确保优雅地处理解析错误。
项目结构
项目结构如下
-
src/lib.rs
: 包含 URL 解析器的实现,包括语法规则和解析逻辑。 -
src/main.rs
: 一个简单的可执行程序,通过解析示例 URL 来演示解析器的使用。 -
tests/tests.rs
: 为各种场景的单元测试,确保 URL 解析逻辑的正确性。 -
Cargo.toml
: 项目配置文件,指定依赖项和其他元数据。
如何运行
要运行项目,请执行以下命令
$ cargo run -- parse http://example.com
or
$ cargo run -- parse path/to/file/file.txt
这将执行 main.rs 文件,演示示例 URL 的解析。
单元测试
项目在 tests.rs 文件中包含了一组全面的单元测试。要运行测试,请使用以下命令
cargo test
依赖项
项目依赖于 pest crate 进行解析和 pest_derive 用于过程宏支持。请确保在 Cargo.toml 文件中正确指定这些依赖项。
[dependencies]
pest = "2.7.5"
pest_derive = "2.7.5"
clap = "2.33"
thiserror = "1.0.0"
URL 语法
url = { scheme ~ "://" ~ host ~ (":" ~ port)? ~ (path ~ ("/" ~ file)? ~ ("?" ~ query)? ~ ("#" ~ fragment)?)? }
scheme = { identifier_with_optional_dot }
host = { identifier_with_optional_dot }
port = { number }
path = { "/" ~ identifier ~ ("/" ~ identifier)* }
query = { identifier ~ ("=" ~ identifier)* }
fragment = { identifier }
file = { identifier ~ ("." ~ identifier)* }
identifier = { ASCII_ALPHANUMERIC+ }
identifier_with_optional_dot = { identifier ~ ( "." ~ ASCII_ALPHANUMERIC+)* }
number = { DIGIT+ }
WHITESPACE = _{ " " | "\n" | "\t" }
ASCII_ALPHANUMERIC = _{ ASCII_ALPHABET | DIGIT }
ASCII_ALPHABET = _{ 'a'..'z' | 'A'..'Z' }
DIGIT = _{ '0'..'9' }
依赖项
~3.5MB
~65K SLoC