1 个不稳定版本

0.1.0 2024年3月17日

#327 in 日期和时间

MIT 许可证

12MB
242K 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 使用需要一个零大小的泛型类型参数,但编译器不能对泛型应用有大小限制)。

完整详情 这里.

依赖项