1 个不稳定版本
0.7.4 | 2024年5月30日 |
---|
#1698 in 魔法豆
310 每月下载量
在 14 个crate(2个直接) 中使用
47KB
1K SLoC
linera-alloy-sol-type-parser
简单轻量级的Solidity类型字符串解析器。
此库主要是linera-alloy-json-abi
和linera-alloy-dyn-abi
的用户界面API的依赖。有关更多信息,请参阅这些crate的文档。
此解析器通常遵循Solidity规范,但它仅支持可能的类型子集,以支持ABI编码。
用法
TypeSpecifier
是此crate中的顶级类型。它是一个字符串部分(称为span
)的包装器。它逐步将字符串分解为子span,并添加有关类型的元数据。例如,它跟踪主类型以及数组维度的尺寸。期望TypeSpecifier
处理任何有效的Solidity类型字符串。
use linera_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
trait 没有为 TypeSpecifier
实现。不幸的是,对于依赖于输入字符串生命周期的类型,无法实现此功能。相反,我们建议使用相关的 parse
函数,或者在需要特质的情况下使用 TryFrom::<&str>::try_from
。
为什么不使用 syn
?
这不是一个完整的语法库,也不打算作为 linera-alloy-syn-solidity
的替代品。这个crate旨在用于解析现有生态系统工具中存在的类型字符串,仅此而已。它不打算用于解析Solidity源代码。
此crate对以下方面有用:
- 检查JSON ABI文件语法
- 为
linera-alloy-dyn-abi
提供已知良好的输入 - 将 ethers.js 代码移植到 rust
它对以下方面没有用:
- 解析Solidity源代码
- 从Solidity源代码生成Rust代码
- 从Rust代码生成Solidity源代码
依赖关系
~1MB
~16K SLoC