diff --git a/lib/errawr/rails.rb b/lib/errawr/rails.rb index dc4b8d7..14f84b7 100644 --- a/lib/errawr/rails.rb +++ b/lib/errawr/rails.rb @@ -3,7 +3,7 @@ require 'errawr/http' require 'errawr/rails/renderable' -require 'errawr/rails/json' +require 'errawr/rails/renderers/json' require 'errawr/rails/version' module Errawr @@ -11,5 +11,14 @@ module Rails def self.included(base) base.send(:include, Errawr::ClassMethods) end + + def self.with_renderer(renderer) + mod = Module.new + mod.define_singleton_method :included do |object| + object.send(:include, Errawr::Rails) + object.send(:include, Errawr::Rails::Renderable.render_with(renderer)) + end + mod + end end end diff --git a/lib/errawr/rails/json.rb b/lib/errawr/rails/json.rb deleted file mode 100644 index 33dfc15..0000000 --- a/lib/errawr/rails/json.rb +++ /dev/null @@ -1,18 +0,0 @@ -module Errawr - module Rails - module JSON - def self.included(base) - base.send(:include, Renderable) - base.class_eval do - def render_errawr(error) - self.status = error.context[:http_status] || 500 - render json: { - error: error.context[:name] || error.key, - description: error.message - }.merge(error.metadata) - end - end - end - end - end -end \ No newline at end of file diff --git a/lib/errawr/rails/renderable.rb b/lib/errawr/rails/renderable.rb index 9b4dae8..49e38fe 100644 --- a/lib/errawr/rails/renderable.rb +++ b/lib/errawr/rails/renderable.rb @@ -1,16 +1,22 @@ module Errawr module Rails module Renderable - def self.included(base) - base.send(:include, Errawr::Rails) unless base.ancestors.include?(Errawr::Rails) - base.send(:include, ActiveSupport::Rescuable) - base.class_eval do - rescue_from Errawr::Error, with: :render_errawr + def self.render_with(handler) + mod = Module.new + mod.define_singleton_method :included do |object| + object.class_eval do + object.const_set(:ERRAWR_HANDLER, handler) + rescue_from Errawr::Error, with: :render_errawr + + private + def render_errawr(error) + handler = self.class.const_get(:ERRAWR_HANDLER) + self.status = error.context[:http_status] || 500 + render handler.new.call(error) + end + end end - end - - def render_errawr - raise 'Method render_errawr not defined...' + mod end end end diff --git a/lib/errawr/rails/renderers/json.rb b/lib/errawr/rails/renderers/json.rb new file mode 100644 index 0000000..7ed209a --- /dev/null +++ b/lib/errawr/rails/renderers/json.rb @@ -0,0 +1,16 @@ +module Errawr + module Rails + module Renderers + class JSON + def call(error) + { + json: { + error: error.context[:name] || error.key, + description: error.message + }.merge(error.metadata) + } + end + end + end + end +end \ No newline at end of file diff --git a/spec/dummy/app/controllers/metadata_controller.rb b/spec/dummy/app/controllers/metadata_controller.rb index 043a570..d428b1c 100644 --- a/spec/dummy/app/controllers/metadata_controller.rb +++ b/spec/dummy/app/controllers/metadata_controller.rb @@ -1,5 +1,5 @@ class MetadataController < ApplicationController - include Errawr::Rails::JSON + include Errawr::Rails.with_renderer(Errawr::Rails::Renderers::JSON) def index register!(:dummy_error, message: 'Dummy Message', metadata: { developer: 'Anthony' }) diff --git a/spec/dummy/app/controllers/renderable_controller.rb b/spec/dummy/app/controllers/renderable_controller.rb index 1d0f0a2..15effa6 100644 --- a/spec/dummy/app/controllers/renderable_controller.rb +++ b/spec/dummy/app/controllers/renderable_controller.rb @@ -1,5 +1,5 @@ class RenderableController < ApplicationController - include Errawr::Rails::JSON + include Errawr::Rails.with_renderer(Errawr::Rails::Renderers::JSON) def index error!(:bad_request) diff --git a/spec/json_spec.rb b/spec/json_spec.rb index 7bfbe81..73232a2 100644 --- a/spec/json_spec.rb +++ b/spec/json_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Errawr::Rails::JSON do +describe Errawr::Rails::Renderers::JSON do context 'RenderableController', type: :controller do controller(RenderableController) do extend RSpec::Rails::ControllerExampleGroup::BypassRescue