3

構築中のサービスのコード ベースでデータ構造 (モデル) を共有できるようにしたいと考えています。domain現在、コードを という名前のライブラリと という名前のバイナリに分割していますlog_service

ライブラリでは、domain以下に示すように、ログの情報を含む構造を定義しました。

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

バイナリでは、ディーゼルをデータベース ORM として使用し、ライブラリlog_serviceで定義されたこの構造をテーブルとして使用したいと考えています。domainディーゼルのドキュメントには、この構造をデータベース テーブルとして使用するには、特定の特性 (例: Queryable) を取得し、場合によっては他の属性を適用する必要があると記載されています。

ただし、Rust は別のクレート内からこの構造体を拡張することを許可していません。Rust には継承が存在しないため、通常、コンポジションを使用してdomainログをラップするオプションがあります。しかし、ディーゼルは構造体を使用してテーブルに直接マップするため、コンポジションを使用してフィールドを公開することはできません。フィールドは構造体の最上位にある必要があるためです。

できれば、両方のクレートにこの構造体をコピーして貼り付けたくないでしょう。マクロを使用して、単一のソースから両方のコード ベースでこれらの構造を生成することを考えていました。これにより、バイナリでログを拡張することができます。

これを解決する最適な方法は何でしょうか?

4

1 に答える 1