如何使用应该在二进制文件中直接与 Rust 扩展的库共享模型?



我希望能够在我正在构建的服务的代码库中共享数据结构(模型(。 我目前已将代码拆分为名为domain的库和名为log_service的二进制文件。

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

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

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

然而,Rust不允许从另一个 crate 中扩展此结构,并且由于 Rust 中不存在继承,因此通常可以选择使用 composition 来包装domainLog。但是,由于 diesel 使用结构直接映射到表,因此无法使用组合来公开字段,因为它们应该是结构上的顶级。

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

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

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

Rust 的orphan rules指出:

。每个特征实现必须满足以下条件之一:

  1. 正在实现的特征在同一个板条箱中定义。

  2. 至少有一个 Self 或特征的泛型类型参数必须满足以下语法,其中 C 是在包含 crate 中定义的名义类型:

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

简单地说,特征或结构必须是板条箱的本地部分,以便您实现它。

因此,最简单的选择是在板条箱本身中为您的Log结构派生domaindiesel::deserialize::Queryable

最新更新