15 个版本 (4 个重大更新)
0.5.1 | 2024 年 7 月 8 日 |
---|---|
0.5.0 | 2024 年 5 月 24 日 |
0.4.1 | 2024 年 2 月 23 日 |
0.3.8 | 2024 年 2 月 22 日 |
0.1.3 | 2024 年 2 月 3 日 |
#517 in 解析器实现
44KB
765 行
包含 (Cab 文件, 14KB) .vs/rust-library/v17/.wsuo
关于
仓库存储了允许从和向 .io 文件格式读写数据的 Rust 库的代码。
功能和计划
序列化和反序列化的当前状态
- 原始类型
- 字符串
- 数组
- 向量
- 哈希表
- 结构体(命名{}和元组)
- 泛型
- 元组
- &str 类型
- 切片
- Option
- Result
- 所有上述类型的组合
- 枚举(单元、未命名、命名)
- 单元类型
()
支持类型的完整列表可以在本 crate 的文档 中找到。
功能
- 使用宏 to_io!() 和对象引用,对 支持类型 进行序列化
- 使用宏 from_io!() 和 .io 格式化的字符串以及所需的对象类型,对 支持类型 进行反序列化
- 使用 #[io_name()] 辅助宏(使用字符串字面量作为参数)在 .io 格式化的字符串中重命名结构体字段
- 使用 #[io_order()] 辅助宏(使用 FIRST 和 LAST 关键字或 i16 整数)在 .io 格式化的字符串中排序结构体字段
以下 示例 展示了这些功能的使用方法。
示例用法
use iodeser::*; // required import
#[derive(IoDeSer, Debug, PartialEq)] // required macro derive IoDeSer, Debug and PartialEq is not required
struct Person<'a> {
#[io_name("Name")] // optional renaming
pub name: &'a str,
#[io_name("SecondName")] // optional renaming
pub second_name: Option<&'a str>,
#[io_name("LastName")] // optional renaming
pub last_name: &'a str,
#[io_name("Age")] // optional renaming
#[io_order(LAST)] // optional ordering using FIRST or LAST keyword
pub age: u8,
#[io_name("Address")] // optional renaming
#[io_order(FIRST)] // optional ordering using FIRST or LAST keyword
pub address: Vec<Address<'a>>,
}
#[derive(IoDeSer, Debug, PartialEq)] // required macro derive, Debug and PartialEq is not required
struct Address<'a> {
#[io_order(3)] // optional ordering using integer
pub city: &'a str,
#[io_order(1)] // optional ordering using integer
pub number: AddressNumberType<'a>,
#[io_order(2)] // optional ordering using integer
pub street: &'a str,
}
#[derive(IoDeSer, Debug, PartialEq)] // required macro derive, Debug and PartialEq is not required
enum AddressNumberType<'a>{
Numeric(u16),
String(&'a str)
}
fn main() {
let person = Person {
name: "John",
second_name: None,
last_name: "Kowalski",
age: 21,
address: vec![
Address {
city: "Warsaw",
number: AddressNumberType::Numeric(65),
street: "Tęczowa",
},
Address {
city: "Hamburg",
number: AddressNumberType::String("220a"),
street: "Strasse",
},
],
};
let io_serialization: String = to_io!(&person); // serialization
println!("{}", &io_serialization);
let person_deserialization: Person = from_io!(io_serialization, Person).unwrap(); // deserialization
println!("{:?}", &person_deserialization);
assert_eq!(person, person_deserialization);
}
/*
Output:
|
Address->|
|
number->|
Numeric->|
|65|
|
|
street->|Tęczowa|
city->|Warsaw|
|
+
|
number->|
String->|
|220a|
|
|
street->|Strasse|
city->|Hamburg|
|
|
Name->|John|
SecondName->|||
LastName->|Kowalski|
Age->|21|
|
Person { name: "John", second_name: None, last_name: "Kowalski", age: 21, address: [Address { city: "Warsaw", number: Numeric(65), street: "Tęczowa" }, Address { city: "Hamburg", number: String("220a"), street: "Strasse" }] }
*/
依赖
~1.3–2MB
~45K SLoC