Class: Terminalwire::Rails::Thor

Inherits:
Server::WebSocket
  • Object
show all
Includes:
Logging
Defined in:
lib/terminalwire/rails.rb

Instance Method Summary collapse

Constructor Details

#initialize(cli_class) ⇒ Thor

Returns a new instance of Thor.



75
76
77
78
79
80
81
# File 'lib/terminalwire/rails.rb', line 75

def initialize(cli_class)
  @cli_class = cli_class

  unless @cli_class.included_modules.include?(Terminalwire::Server::Thor)
    raise 'Add `include Terminalwire::Server::Thor` to the #{@cli_class.inspect} class.'
  end
end

Instance Method Details

#error_messageObject



83
84
85
# File 'lib/terminalwire/rails.rb', line 83

def error_message
  "An error occurred. Please try again."
end

#handle(adapter:, env:) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/terminalwire/rails.rb', line 87

def handle(adapter:, env:)
  logger.info "ThorServer: Running #{@cli_class.inspect}"
  while message = adapter.read
    case message
    in { event: "initialization", protocol:, program: { arguments: }, entitlement: }
      context = Terminalwire::Server::Context.new(adapter:, entitlement:)
      exit_code = 0

      begin
        @cli_class.terminalwire arguments:, context: do |cli|
          cli.default_url_options[:host] = env["HTTP_HOST"]
        end
      rescue ::Thor::UndefinedCommandError, ::Thor::InvocationError => e
        context.stdout.puts e.message
      rescue ::StandardError => e
        # Log the error
        handler_error_message = "          \#{e.class.name} (\#{e.message})\n\n          \#{e.backtrace.join(\"\\n\")}\n        ERROR\n\n        ::Rails.logger.error(handler_error_message)\n        # Report the error to Rails' notification system\n        ::Rails.error.report(e, handled: true)\n\n        if ::Rails.application.config.consider_all_requests_local\n          # Show the full error message with stack trace in development\n          context.stderr.puts handler_error_message\n        else\n          # Show a generic message in production\n          context.stderr.puts error_message\n        end\n        exit_code = 1\n      ensure\n        context.exit exit_code\n      end\n    end\n  end\nend\n"