レイヤー設定
[[layers]]
| キー | 説明 |
|---|---|
name | レイヤー名 |
paths | このレイヤーに属するファイルのグロブパターン |
dependency_mode | "opt-in"(allow に列挙したもののみ許可)または "opt-out"(deny に列挙したもの以外を許可) |
allow | 依存を許可するレイヤー(dependency_mode = "opt-in" 時) |
deny | 依存を禁止するレイヤー(dependency_mode = "opt-out" 時) |
external_mode | "opt-in" または "opt-out"(外部ライブラリ向け) |
external_allow | 許可する外部パッケージ(external_mode = "opt-in" 時) |
external_deny | 禁止する外部パッケージ(external_mode = "opt-out" 時) |
name_deny | 禁止キーワード(大文字小文字区別なし・部分一致)→ 詳細はネーミング規則 |
name_allow | name_deny チェック前に除外する部分文字列 |
name_targets | チェック対象(file, symbol, variable, comment)デフォルト: 全て |
name_deny_ignore | チェック除外ファイルのグロブパターン |
opt-in / opt-out モデル
| モード | デフォルト | 書くもの | 向いているレイヤー |
|---|---|---|---|
opt-in | 全て NG | 許可するものを allow / external_allow に列挙 | domain, usecase, presentation |
opt-out | 全て OK | 禁止するものを deny / external_deny に列挙 | infrastructure |
内部依存の例
[[layers]]name = "domain"dependency_mode = "opt-in"allow = [] # 何にも依存しない
[[layers]]name = "usecase"dependency_mode = "opt-in"allow = ["domain"] # domain のみ参照可
[[layers]]name = "infrastructure"dependency_mode = "opt-out" # 内部レイヤーは全て OKdeny = []外部ライブラリ依存の例
external_allow / external_deny の値は正規表現で指定できます。
[[layers]]name = "domain"external_mode = "opt-in"external_allow = [] # 外部ライブラリは原則 NG
[[layers]]name = "usecase"external_mode = "opt-in"external_allow = ["serde", "uuid", "chrono"]
[[layers]]name = "infrastructure"external_mode = "opt-out" # 何でも使って OKexternal_deny = [][[layers.allow_call_patterns]]
任意のレイヤーにおいて、依存先レイヤーのメソッド呼び出しを制限します。 典型的な用途は DI 組み立てレイヤー(main 等)で infrastructure のファクトリメソッドだけを許可するケースですが、usecase から domain のメソッドを制限するなど、どのレイヤーにも設定できます。
| キー | 説明 |
|---|---|
callee_layer | メソッド呼び出しを制限する対象レイヤー |
allow_methods | 許可するメソッド名のリスト |
[[layers]]name = "main"paths = ["src/main.rs"]dependency_mode = "opt-in"allow = ["domain", "infrastructure", "usecase"]
[[layers.allow_call_patterns]] callee_layer = "infrastructure" allow_methods = ["new", "build", "create", "init", "setup"]これにより以下のような違反を検出できます:
// OK: インスタンス生成(allow_methods に該当)let repo = UserRepositoryImpl::new();
// NG: ビジネスロジックの直接呼び出しrepo.find_user(1); // ❌ allow_methods に該当しない