コンテンツにスキップ

rigor-dry-struct

Dry::Structのサブクラスにおけるdry-structのクラスレベルのattribute :name, Type / attribute? :name, Type DSLを認識し、それが生成するリーダーメソッドを合成します。これにより、別ファイル内の素のaddress.citycall.undefined-methodに落ちずに解決されます。

rigortypeにバンドルされて配布されます。有効化し、さらに正確なリーダー型のためにrigor-dry-typesと組み合わせます。

plugins:
- rigor-dry-struct
- rigor-dry-types # optional: resolves Types::String → String on the readers
class Address < Dry::Struct
attribute :city, Types::String
attribute? :postcode, Types::String
end
address.city # resolves (synthesised reader)
address.postcode # resolves

rigor-dry-typesも有効で、プロジェクトがmodule Types; include Dry.Types(); endを宣言している場合、リーダーの戻り値の型は属性の型引数を通じて解決されます(attribute :city, Types::StringcityStringを返す)。dry-typesがロードされていない場合、または解決できないシェイプ(.constrained(...)チェーンやインラインの合成)の場合、リーダーはDynamic[Top]にフォールバックします。これは静かに行われ、diagnosticは出ません。

このプラグインは、diagnosticではなく合成されたメソッドを提供し、configキーは持ちません。Dry::Structを継承するあらゆるクラスを扱います(字句的・推移的に、あるいはチェーンが上流で終端する場合はRBS環境を通じて)。その目に見える効果は、属性リーダーの呼び出しが型チェックを通ることです。

  • リーダーのみschema / to_h / [:key] / キーワード引数の.new(name:)のシェイプはまだ合成されません。
  • ネストしたブロック形式は非対応attribute :details do … end(兄弟のDry::Structサブクラスを生成する)は先送りされています。

宣言的なHeredocTemplateマニフェスト、returns_from_argの精度パス(ADR-18)、そしてそれが乗っている合成メソッドの基盤についてはプラグインのREADMEに記載されています。プラグインを書くにはexamples/rigor-plugin-authorスキルを参照してください。

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.