コンテンツにスキップ

レイヤー設定

[[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_allowname_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" # 内部レイヤーは全て OK
deny = []

外部ライブラリ依存の例

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" # 何でも使って OK
external_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 に該当しない