#serde #x12 #edi #document #segment #elements #format

serde_x12_alt

Serde 对 X12 EDI 的支持

2 个不稳定版本

0.2.0 2024年5月16日
0.1.0 2024年3月17日

#516 in 编码

Download history 124/week @ 2024-05-16 8/week @ 2024-05-23 1/week @ 2024-05-30 2/week @ 2024-07-04

每月下载量 107

MIT 许可证

40KB
1K SLoC

X12

有两个相关的包

  • x12_alt,其中包含表示 x12 事务、段和元素的 struct。
  • serde_x12_alt,其中包含将数据序列化和反序列化为 x12 格式的 serde 实现。

示例

use serde_x12::{from_str, to_string};
use x12::Document;
use x12::release_5010::transactions::HealthCareClaim;

fn main() {
    let x12 = include_str!("../data/CHPW_Claimdata.txt");
    let doc = from_str::<Document<HealthCareClaim>>(&x12).unwrap();
    let r = to_string(&doc).unwrap();
    println!("{}", r);
}

此代码展示了读取,但不展示逐字节相同的输出,因为分隔符信息已丢失。(输入文件格式使用回车换行符 \r\n 作为视觉分隔符。)使用此代码进行逐字节相同的往返。

use serde_x12::{detect_format, from_str};
use x12::Document;
use x12::release_5010::transactions::HealthCareClaim;

fn main() {
    let x12 = include_str!("../data/CHPW_Claimdata.txt");
    let f = detect_format(x12).unwrap();
    let doc = from_str::<Document<HealthCareClaim>>(&x12).unwrap();
    let r = f.to_string(&doc).unwrap();
    assert_eq!(x12, r);
}

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
x12_alt = "0.1"
serde_x12_alt = "0.1"

分别使用 use x12::..use serde_x12::.. 来使用库。 alt 只是为了防止 crates.io 命名冲突。

讨论

x12 包目前没有尝试在不同版本之间共享 struct(例如,5010 与 8010)。这可能在未来的版本中得到修复。

它也没有尝试通过枚举统一它们,根据检测到 ISA 头中的版本进行反序列化。目前,该功能留给库用户。

警告

serde_x12 中有一个单独的 unsafe 使用。为了实现反序列化,库在反序列化可选内容时需要回溯,但 serde API 似乎不支持这一点。代码通过了 miri,但据我理解,保证 unsafe 是安全的不可变性的不变性不能由编译器强制执行。(具体来说,unsafe 使用需要一个零大小的泛型类型参数,但编译器无法对泛型施加有大小限制。)

完整细节 在此

依赖关系

~0.4–10MB
~64K SLoC