我希望能够在我正在构建的服务的代码库中共享数据结构(模型(。 我目前已将代码拆分为名为domain
的库和名为log_service
的二进制文件。
在domain
库中,我定义了一个结构,该结构将包含日志的信息,如下所示。
pub struct Log {
pub id: u32,
pub message: String,
}
在log_service
二进制文件中,我想使用 diesel 作为数据库 ORM,并使用domain
库中定义的此结构作为表。柴油文档指出,为了将此结构用作数据库表,您需要导出某些特征(例如Queryable
(,并可能应用其他属性。
然而,Rust不允许从另一个 crate 中扩展此结构,并且由于 Rust 中不存在继承,因此通常可以选择使用 composition 来包装domain
Log。但是,由于 diesel 使用结构直接映射到表,因此无法使用组合来公开字段,因为它们应该是结构上的顶级。
最好我不想在两个板条箱中复制粘贴此结构。 我一直在考虑使用宏从单个源在两个代码库中生成这些结构,这仍然允许扩展二进制文件中的日志。
解决这个问题的最佳方法是什么?
No.如果您绝对必须维护项目的当前结构,则无法(轻松(完成此操作。
Rust 的orphan rules
指出:
。每个特征实现必须满足以下条件之一:
正在实现的特征在同一个板条箱中定义。
至少有一个 Self 或特征的泛型类型参数必须满足以下语法,其中 C 是在包含 crate 中定义的名义类型:
T = C | &C | &mut C | Box<C>
简单地说,特征或结构必须是板条箱的本地部分,以便您实现它。
因此,最简单的选择是在板条箱本身中为您的Log
结构派生domain
diesel::deserialize::Queryable
。