1 个稳定版本

1.0.0 2023年11月17日

#5 in #url-scheme

MIT/Apache

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