module Pleiades::Command::Routing::NestBlocks
ブロック付きメソッド郡。
イベントメソッドに渡すキーワード引数を、ネストしたリソースとしてまとめて実行する。
Public Instance Methods
コマンドクラスへの呼び出すメソッド名をネストしたリソースに適用する。
## EXAMPLE ### 使用しない postback scope :hoge, action: :fuga, method: :greet # => Hoge::Fuga#greet が実行される。
postback scope :hoge, action: :piyo, method: :greet # => Hoge::Piyo#greet が実行される
### 使用する method: :greet do
postback scope :hoge, action: :fuga postback scope :hoge, action: :piyo
end
アクションをネストする。
EXAMPLE ## 使用しない postback scope :hoge, action: :piyo postback scope :fuga, action: :piyo
## 使用する action :piyo do
postback scope :hoge postback scope :fuga
end
## EXAMPLE(単一リソースのネスト) ### 使用しない postback scope :hoge, action: :piyo postback scope :fuga, action: :piyo
### 使用する action :piyo do
postback scope :hoge postback scope :fuga
end
## EXAMPLE(複数リソースのネスト) ### 使用しない postback scope :piyo, action: :hoge postback scope :piyo, action: :fuga
### 使用する action :hoge, :fuga do
postback scope: :piyo
end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 85 def action(*actions, &block) actions.flatten.map { |act| nest_block __method__, act, &block } end
Concernsをネストしたリソースに適用する。
concern HogeModule do
postback # => HogeModule が include される concern FugaModule do postback # => HogeModule, FugaModule が include される end
end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 98 def concern(*concerns, &block) nest_block __method__, concerns, &block end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 119 def method(method_name, &block) if block_given? nest_block __method__, method_name, &block else _method_(method_name) end end
複数のネストメソッドを呼び出す。
EXAMPLE ## 使用しない
scope :hoge do
action :fuga do postback end
end
## 使用する nest_blocks
scope: :hoge, action: :fuga do
postback
end
@param [Hash] key: ネストメソッド名, val: 引数
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 145 def nest_blocks(**keywords, &block) validate_event_keywords(keywords.deep_dup.merge(type: '')) nested_options = make_nested_options(keywords) return if nested_options == false nested_options.each do |opt| nest(@options.deep_dup.merge(opt), &block) end end
スコープをネストする。
## メソッド呼び出し時のメソッド名による処理の違い scope, scope_append
引数を後方追加する
scope_unshift
引数を前方追加する
## EXAMPLE(単一リソースのネスト) ### 使用しない postback scope :hoge, action: :fuga postback scope :hoge, action: :piyo
### 使用する scope :hoge do
postback action: :fuga postback action: :piyo
end
## EXAMPLE(複数リソースのネスト) ### 使用しない postback scope :hoge, action: :piyo postback scope :fuga, action: :piyo
### 使用する scope :hoge, :fuga do
postback action: :piyo
end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 45 def scope(*scopes, &block) scopes.flatten.map { |scp| nest_block __callee__, scp, &block } end
Private Instance Methods
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 230 def __merge__(proc) dup_options = @options.deep_dup proc.call(dup_options) dup_options end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 182 def callable_nest_methods reject_methods = %i[nest_blocks _method_] Pleiades::Command::Routing::NestBlocks.public_instance_methods.without(*reject_methods) end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 188 def default_options { scope: [], action: '', method: '', concern: [] }.merge(Pleiades::Config.router_default_option) end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 159 def make_nested_options(keywords) nested_options = keywords.each_pair .each_with_object([[self]]) do |(method_name, arg), arr| routers = arr.last break if routers.include?(false) arr << nest_routers(routers) { method(method_name).call(arg) }.flatten end nested_options ? nested_options.last.map(&:options) : false end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 218 def merge_action(action) __merge__ ->(option) { option[:action] = action } end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 222 def merge_concern(concerns) __merge__ ->(option) { option[:concern].concat(concerns).flatten } end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 226 def merge_method(method) __merge__ ->(option) { option[:method] = method } end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 204 def merge_scope(context) operator = case __callee__ when /^merge_scope(_append)?$/ :append when /^merge_scope_unshift$/ :unshift end __merge__ ->(option) { option[:scope].__send__ operator, context } end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 197 def nest_block(method_name, context, &block) @_options = __send__ "merge_#{method_name}", context @_self = Pleiades::Command::Router.new(@_options) block_given? ? @_self.instance_eval(&block) : @_self end
# File lib/pleiades/core/command/routing/nest_blocks.rb, line 172 def nest_routers(routers, &proc) routers.map do |router| nest_router = Array.wrap(nest(router.options.deep_dup, &proc)) break if nest_router.include?(false) nest_router end || [false] end