9 个版本

新版本 0.4.2 2024 年 8 月 22 日
0.4.1 2023 年 1 月 27 日
0.4.1-rc.02023 年 12 月 18 日
0.3.0 2022 年 12 月 23 日
0.1.1 2022 年 5 月 24 日

#672 in Rust 模式

Download history 95/week @ 2024-05-02 40/week @ 2024-05-09 79/week @ 2024-05-16 80/week @ 2024-05-23 82/week @ 2024-05-30 80/week @ 2024-06-06 38/week @ 2024-06-13 64/week @ 2024-06-20 92/week @ 2024-06-27 70/week @ 2024-07-04 93/week @ 2024-07-11 90/week @ 2024-07-18 164/week @ 2024-07-25 152/week @ 2024-08-01 97/week @ 2024-08-08 27/week @ 2024-08-15

460 monthly downloads

MIT 许可证

16KB
204

positional.rs Build Status

这是一个用于编写和解析位置文件的库

RustDoc


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

我们注释结构体以将其序列化到/反序列化自位置行。我们还需要注释结构体中的每个字段以配置字段规范。

可能的属性有

属性名称 必需的 类型 默认值 描述
大小 数字 --- 定义位置行中字段的大小
填充物 字符 空白 定义字段中的空格表示什么
对齐 字符串 "" 定义字段的对齐方式。可以是

使用您自己的类型

字段不仅限于简单的类型,如 Stringi32,只要实现了 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]。您可以使用这些特质,并仅使用位置库来处理实际的解析/创建位置文件。

过程宏 FromPositionalRowToPositionalRow 只是通过利用注解和 Rust 类型系统为您实现。

依赖关系

~2–9.5MB
~90K SLoC