我如何使用一个库共享模型,该库应该在二进制文件中直接扩展到 Rust?

How do I share models using a library that should be directly extended upon in a binary with Rust?

我希望能够在我正在构建的服务的代码库中共享数据结构(模型)。 我目前将代码拆分为一个名为 domain 的库和一个名为 log_service.

的二进制文件

domain 库中,我定义了一个包含日志信息的结构,如下所示。

pub struct Log {
    pub id: u32,
    pub message: String,
}

log_service 二进制文件中,我想使用柴油作为数据库 ORM,并将 domain 库中定义的结构用作 table。 diesel 文档指出,为了将此结构用作数据库 table,您需要派生某些特征(例如 Queryable)并可能应用其他属性。

但是 Rust 不允许从另一个板条箱中扩展这个结构,并且因为 Rust 中不存在继承,所以通常可以选择使用组合来包装 domain 日志。但是因为 diesel 使用结构直接映射到 table,所以不可能使用组合来公开字段,因为它们应该是结构的顶层。

最好我不想在两个板条箱中复制粘贴这个结构。 我一直在考虑使用宏从单一来源在两个代码库中生成这些结构,这仍然允许在二进制文件中扩展日志。

解决这个问题的最佳方法是什么?

没有。如果您绝对必须维护项目的当前结构,则无法(轻松)完成此操作。

Rust 的 orphan rules 状态:

... that every trait implementation must meet either of the following conditions:

  1. The trait being implemented is defined in the same crate.

  2. At least one of either Self or a generic type parameter of the trait must meet the following grammar, where C is a nominal type defined within the containing crate:

 T = C
   | &C
   | &mut C
   | Box<C>

简而言之,trait 或 struct 必须是 crate 本地的才能实现它。

所以对您来说最简单的选择是在 domain 板条箱本身中为您的 Log 结构派生 diesel::deserialize::Queryable