9 个版本
新版本 0.4.2 | 2024 年 8 月 22 日 |
---|---|
0.4.1 | 2023 年 1 月 27 日 |
0.4.1-rc.0 | 2023 年 12 月 18 日 |
0.3.0 | 2022 年 12 月 23 日 |
0.1.1 | 2022 年 5 月 24 日 |
#672 in Rust 模式
460 monthly downloads
16KB
204 行
positional.rs
这是一个用于编写和解析位置文件的库
lib.rs
:
这是一个用于解析和写入位置文件的库
入门
您首先定义自己的结构体,该结构体表示位置文件中的一行
struct RowData {
name: String,
surname: String,
age: i32,
}
如果您在内存中有数据并想将结构体序列化为位置文件,您需要使用 ToPositionalRow
derive 注解结构体。
use positional::ToPositionalRow;
#[derive(ToPositionalRow)]
struct RowData {
#[field(size = 10)]
name: String,
#[field(size = 10, filler = '-')]
surname: String,
#[field(size = 5, align = "right")]
age: i32,
}
let row_data = RowData {
name: "test".to_string(),
surname: "test".to_string(),
age: 20,
};
assert_eq!("test test------ 20", row_data.to_positional_row());
如果您正在解析文件,您可以使用 FromPositionalRow
derive
use positional::FromPositionalRow;
#[derive(FromPositionalRow, PartialEq, Debug)]
struct RowData {
#[field(size = 10)]
name: String,
#[field(size = 10, filler = '-')]
surname: String,
#[field(size = 5, align = "right")]
age: i32,
}
let row_data = RowData {
name: "test".to_string(),
surname: "test".to_string(),
age: 20,
};
assert_eq!(RowData::from_positional_row("test test------ 20").unwrap(), row_data);
如果这在您的领域模型中有意义,您可以在同一个结构体上同时使用这两个 derive
我们注释结构体以将其序列化到/反序列化自位置行。我们还需要注释结构体中的每个字段以配置字段规范。
可能的属性有
属性名称 | 必需的 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
大小 | 是 | 数字 | --- | 定义位置行中字段的大小 |
填充物 | 否 | 字符 | 空白 |
定义字段中的空格表示什么 |
对齐 | 否 | 字符串 | "左" |
定义字段的对齐方式。可以是 左 或 右 |
使用您自己的类型
字段不仅限于简单的类型,如 String
或 i32
,只要实现了 FromStr
trait 以进行解析和 ToString
trait 以进行序列化,您就可以使用任何类型。对于 ToString 实现,库将负责填充和修剪用于位置表示的值。您只需要将值转换为字符串。
具有多个行类型的文件
可能存在位置文件包含多个行类型的情况。在这种情况下,通常可以通过查看行中特定位置来区分每一行,该位置用于标识行类型。这对解析很有用,序列化基本上是相同的。您可以使用枚举来表示文件中的所有行。
use positional::{FromPositionalRow, ToPositionalRow};
#[derive(FromPositionalRow, ToPositionalRow)]
enum Rows {
#[matcher(&row[0..2] == "10")]
Row1(Row1Data),
#[matcher(&row[0..2] == "20")]
Row2(Row2Data),
}
#[derive(FromPositionalRow, ToPositionalRow)]
struct Row1Data {
#[field(size = 2)]
row_type: String,
#[field(size = 20)]
name: String,
#[field(size = 20, align = "right")]
age: i32,
}
#[derive(FromPositionalRow, ToPositionalRow)]
struct Row2Data {
#[field(size = 2)]
row_type: String,
#[field(size = 20)]
name: String,
#[field(size = 20, align = "right")]
age: i32,
}
枚举应具有一个(且仅一个)匿名参数的变体。为了告诉您注解的枚举变体,请使用 matcher
属性并提供一个表达式。表达式可以访问 row
变量,该变量包含作为字符串的完整行。在示例中,我们正在匹配字符串的前两个字符与给定值
工作原理
在底层,库仅处理 2 个特质:[FromPositionalRow] 和 [ToPositionalRow]。您可以使用这些特质,并仅使用位置库来处理实际的解析/创建位置文件。
过程宏 FromPositionalRow
和 ToPositionalRow
只是通过利用注解和 Rust 类型系统为您实现。
依赖关系
~2–9.5MB
~90K SLoC