我如何使用一个库共享模型,该库应该在二进制文件中直接扩展到 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:
The trait being implemented is defined in the same crate.
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
。
我希望能够在我正在构建的服务的代码库中共享数据结构(模型)。
我目前将代码拆分为一个名为 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:
The trait being implemented is defined in the same crate.
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
。