25 个版本 (5 个重大变更)
新 0.8.0 | 2024 年 8 月 21 日 |
---|---|
0.7.7 | 2024 年 7 月 8 日 |
0.7.6 | 2024 年 6 月 10 日 |
0.7.0 | 2024 年 3 月 30 日 |
0.3.1 | 2023 年 7 月 30 日 |
#627 在 神奇豆子
101,791 每月下载量
在 67 个 crate 中使用 (2 个直接使用)
65KB
1K SLoC
alloy-sol-type-parser
简单轻量级的 Solidity 类型字符串解析器。
此库主要是 alloy-json-abi
和 alloy-dyn-abi
的用户界面 API 的依赖项。请参阅这些 crate 的文档以获取更多信息。
此解析器通常遵循 Solidity 规范,但它只支持类型子集,以便支持 ABI 编码。
使用方法
TypeSpecifier
是此 crate 中的顶级类型。它是字符串(称为 span
)的一部分的包装器。它将字符串逐步分解成子 span,并添加有关类型的元数据。例如,它跟踪基本类型以及数组维度的尺寸。一个 TypeSpecifier
应该能够处理任何有效的 Solidity 类型字符串。
use alloy_sol_type_parser::TypeSpecifier;
use core::num::NonZeroUsize;
// Parse a type specifier from a string
let my_type = TypeSpecifier::parse("uint8[2][]").unwrap();
// Read the total span
assert_eq!(
my_type.span(),
"uint8[2][]"
);
// A type specifier has a stem type. This is the type string, stripped of its
// array dimensions.
assert_eq!(my_type.stem.span(), "uint8");
// Arrays are represented as a vector of sizes. This allows for deep nesting.
assert_eq!(
my_type.sizes,
// `None` is used for dynamic sizes. This is equivalent to `[2][]`
vec![NonZeroUsize::new(2), None]
);
// Type specifiers also work for complex tuples!
let my_tuple = TypeSpecifier::parse("(uint8,(uint8[],bool))[39]").unwrap();
assert_eq!(
my_tuple.stem.span(),
"(uint8,(uint8[],bool))"
);
// Types are NOT resolved, so you can parse custom structs just by name.
let my_struct = TypeSpecifier::parse("MyStruct").unwrap();
为什么不支持 parse()
?
由于生命周期限制,core::str::FromStr
特性未对 TypeSpecifier
实现。不幸的是,对于依赖于输入字符串生命周期的类型,实现此特性是不可能的。相反,我们建议使用 parse
相关函数,或在需要特性时使用 TryFrom::<&str>::try_from
。
为什么不使用 syn
?
这不是一个完整的语法库,也不打算作为 syn-solidity
的替代品。这个包旨在用于解析现有生态系统工具中存在的类型字符串,仅此而已。它不打算用于解析 Solidity 源代码。
此包适用于:
- 语法检查 JSON ABI 文件
- 为
alloy-dyn-abi
提供已知良好的输入 - 将 ethers.js 代码移植到 Rust
它不适用于:
- 解析 Solidity 源代码
- 从 Solidity 源代码生成 Rust 代码
- 从 Rust 代码生成 Solidity 源代码
依赖项
~1MB
~20K SLoC