Module: Ukiryu::Tools::ClassGenerator
- Defined in:
- lib/ukiryu/tools/class_generator.rb
Overview
Class generation utilities for tool-specific classes
This module handles the dynamic generation of Options, Action, and Response classes for each tool command, keeping the Base class focused on execution.
Class Method Summary collapse
-
.generate_action_class(tool_class, command_name, command_def) ⇒ Class
Generate an action class for a command.
-
.generate_options_class(tool_class, command_name, command_def) ⇒ Class
Generate an options class for a command.
-
.generate_response_class(tool_class, command_name, command_def) ⇒ Class
Generate a response class for a command.
Class Method Details
.generate_action_class(tool_class, command_name, command_def) ⇒ Class
Generate an action class for a command
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/ukiryu/tools/class_generator.rb', line 81 def self.generate_action_class(tool_class, command_name, command_def) class_name = "#{command_name.to_s.capitalize}Action" action_class = Class.new(::Ukiryu::Action::Base) do @command_name = command_name @command_def = command_def @tool_class = tool_class singleton_class.send(:define_method, :command_name) do @command_name end singleton_class.send(:define_method, :command_def) do @command_def end singleton_class.send(:define_method, :tool_class) do @tool_class end end tool_class.const_set(class_name, action_class) unless tool_class.const_defined?(class_name) action_class end |
.generate_options_class(tool_class, command_name, command_def) ⇒ Class
Generate an options class for a command
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/ukiryu/tools/class_generator.rb', line 16 def self.(tool_class, command_name, command_def) # Capture tool class in closure tool_class_ref = tool_class # Create class name class_name = "#{command_name.to_s.capitalize}Options" # Define the class in the tool's namespace = Class.new(::Ukiryu::Options::Base) do # Store command definition @command_def = command_def @command_name = command_name @tool_class = tool_class_ref # Class methods singleton_class.send(:define_method, :command_def) do @command_def end singleton_class.send(:define_method, :command_name) do @command_name end singleton_class.send(:define_method, :tool_class) do @tool_class end end # Define accessors using the OptionsBuilder Ukiryu::OptionsBuilder.define_accessors(, command_def) Ukiryu::OptionsBuilder.define_to_shell_method(, command_def) Ukiryu::OptionsBuilder.define_validation_method(, command_def) # Define extra_args accessor for manual option injection .send(:attr_accessor, :extra_args) # Define set() method for batch assignment .send(:define_method, :set) do |params| params.each do |key, value| setter = "#{key}=" send(setter, value) if respond_to?(setter) end self end # Define run() method that executes on the associated tool .send(:define_method, :run) do # Validate options before execution validate! tool_instance = tool_class_ref.new tool_instance.execute(command_name, self) end # Const the class in the tool's namespace tool_class_ref.const_set(class_name, ) unless tool_class_ref.const_defined?(class_name) end |
.generate_response_class(tool_class, command_name, command_def) ⇒ Class
Generate a response class for a command
112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/ukiryu/tools/class_generator.rb', line 112 def self.generate_response_class(tool_class, command_name, command_def) class_name = "#{command_name.to_s.capitalize}Response" response_class = Class.new(::Ukiryu::Response::Base) do @command_name = command_name @command_def = command_def end tool_class.const_set(class_name, response_class) unless tool_class.const_defined?(class_name) response_class end |